Путаница с зацепками мыши в C++
Я пытаюсь получить глобальную позицию мыши. У меня работает ловушка, которая может определить положение мыши, однако она имеет доступ только к ней внутри кода ловушки. Попытка получить доступ к данным внутри 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 в мою основную.
2 ответа
Повторно этот отправленный код:
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
, который не делает никакого вывода, закодируйте свой собственный. - Не для функциональности, а только потому, что нынешний код подобен очень грязной одежде, которая служит своей цели, но которую не хочется носить: заменить Microsoft
WinMain
чудовище со стандартными C и C++main
,
Для глобальной процедуры подключения mouseHookProc
должен быть в DLL, чтобы его можно было внедрить в процессы. Проверьте это: http://www.codeproject.com/Articles/1037/Hooks-and-DLLs