HANDLE hWnd;
hWnd = GetForegroundWindow();
char szTitle[41] = {0};
GetWindowText(hWnd,szTitle,40);
//Memo1->Lines->Add((int)GetCurrentThreadId());
//Memo1->Lines->Add((int)GetWindowThreadProcessId(hWnd,NULL));
if(LastId!=(int)GetWindowThreadProcessId(hWnd,NULL)){
//Memo1->Lines->Add(">>>change");
LastId = (int)GetWindowThreadProcessId(hWnd,NULL);
UnhookWindowsHookEx(hook);
hook = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)GetSymbol, NULL, LastId);
}
Проблема с SetWindowsHookEx
Код:
Функция GetSymbol находится в программе (не в ДЛЛ). Вообще программа должна при смене активного окна снимать старый хук и устанавливать его на новое окно, но на деле все подругому. Если убрать комментарии, то можно увидеть, что программа просматривает номер ID активного окна и меняет(!) хук, но работает он только с окном программы несмотря на установку на другое окно.
Почему? Можно ли это как-то исправить или кроме ДЛЛ вариантов нет. (задумывался кейлогер на все окна, но без ДЛЛ)
Если что, сижу под WinXP.
Код:
hook = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)GetSymbol, GetmoduleHandle(NULL), LastId);
Цитата:
hook = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)GetSymbol, GetmoduleHandle(NULL), LastId);
Теперь при нажатии клавиши в другой программе (пробовал с блокнотом) эта программа закрывается :)
(В обработке нажатия клавиши стоит ShowMessage((int)wParam); )
Цитата: erzik
Можно ли это как-то исправить или кроме ДЛЛ вариантов нет.
Больше вариантов нет, т.к. при установке хука винда внедряет длл
в адресное пространсвто того процесса, которому приндалежит окно. Т.е. обработчик должен находится не в твоей программе.