Я пытаюсь получить глобальную позицию мыши. У меня работает ловушка, которая может определить положение мыши, однако она имеет доступ только к ней внутри кода ловушки. Попытка получить доступ к данным внутри main не работает.
Лучший способ объяснить это с помощью кода:
LRESULT CALLBACK mouseHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
PMSLLHOOKSTRUCT p = (PMSLLHOOKSTRUCT) lParam;
position.x = p->pt.x;
position.y = p->pt.y;
std::cout<<position.x<<std::endl;
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
int WINAPI WinMain (HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpszArgument,int nCmdShow)
{
HHOOK mouseHook = SetWindowsHookEx(WH_MOUSE_LL,mouseHookProc,hInstance,NULL);
MessageBox(NULL, "Press OK to close.", "", MB_OK);
return 0;
}
С помощью приведенного выше кода, перемещение мыши покажет новую позицию в окне консоли. Однако, если я поставлю std::cout<<position.x<<std::endl;
внутри main, он просто скажет 0. position
это глобальная переменная.
Код, когда вывод находится внутри main:
LRESULT CALLBACK mouseHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
PMSLLHOOKSTRUCT p = (PMSLLHOOKSTRUCT) lParam;
position.x = p->pt.x;
position.y = p->pt.y;
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
int WINAPI WinMain (HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpszArgument,int nCmdShow)
{
HHOOK mouseHook = SetWindowsHookEx(WH_MOUSE_LL,mouseHookProc,hInstance,NULL);
for(;;)
{
std::cout<<position.x<<std::endl;
}
MessageBox(NULL, "Press OK to close.", "", MB_OK);
return 0;
}
Первый кусок кода работает нормально, он определяет положение мыши, я просто не знаю, как получить данные x, y в мою основную.
повторно этот отправленный код:
LRESULT CALLBACK mouseHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
PMSLLHOOKSTRUCT p = (PMSLLHOOKSTRUCT) lParam;
position.x = p->pt.x;
position.y = p->pt.y;
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
int WINAPI WinMain (HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpszArgument,int nCmdShow)
{
HHOOK mouseHook = SetWindowsHookEx(WH_MOUSE_LL,mouseHookProc,hInstance,NULL);
std::cout<<position.x<<std::endl;
MessageBox(NULL, "Press OK to close.", "", MB_OK);
return 0;
}
Вот что должна указывать основная функция:
SetWindowsHookEx
(это происходит один раз).position
(это происходит один раз).MessageBox
(это происходит один раз).Это все.
Во время звонка MessageBox
вызывается процедура ловушки (всякий раз, когда вы перемещаете мышь), но она не делает ничего видимого, только внутреннее обновление.
Почему ты ожидал большего?
Как исправить:
MessageBox
, который не делает никакого вывода, закодируйте свой собственный.WinMain
чудовище со стандартными C и C ++ main
,За глобальный хук процедура подключения mouseHookProc
должен быть в DLL, чтобы его можно было внедрить в процессы.
Проверь это:
http://www.codeproject.com/Articles/1037/Hooks-and-DLLs