Windows — путаница с зацепками мыши в переполнении стека

Я пытаюсь получить глобальную позицию мыши. У меня работает ловушка, которая может определить положение мыши, однако она имеет доступ только к ней внутри кода ловушки. Попытка получить доступ к данным внутри 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 в мою основную.

0

Решение

повторно этот отправленный код:

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,
2

Другие решения

За глобальный хук процедура подключения mouseHookProc должен быть в DLL, чтобы его можно было внедрить в процессы.
Проверь это:
http://www.codeproject.com/Articles/1037/Hooks-and-DLLs

1

По вопросам рекламы [email protected]