Win API: как отловить каждое сообщение от пользовательского ввода? - PullRequest
1 голос
/ 28 декабря 2010

хочу поймать:

  1. Изменение размера окна / перемещение / сворачивание / сворачивание / закрытие сообщений.
  2. щелчки мыши и клавиатуры.
  3. Когда какая-либо программа была выполнена пользователем, либо нажав клавишу ввода, либо dblclick. (если это возможно?)

Это должно работать так же, как работают программы блокировки клавиш: если вы делаете какое-либо событие, я могу через свою программу решить, позволю ли Windows обрабатывать его, или я обработаю это, или оба.

Как я могу это сделать?

1 Ответ

1 голос
/ 29 декабря 2010

Как отметил Ханс Пассант, вам нужна функция SetWindowsHookEx .
В ссылке подробно описаны все возможные хуки, а также функции хуков, которые нужно реализовать. Вот небольшой пример того, как установить глобальный хук, который будет обрабатывать сообщения после их обработки окном.

int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){

  HHOOK msgHook = SetWindowsHookEx(WH_CALLWNDPROCRET, msgHook, hInstance, 0);

  if(msgHook == NULL){
    //Error handling here
    cout << "Failed to set hook";
  }
  else{
    //Hook has been set and will automatically be removed, when your application exits.
  }

//A clean shutdown should always unhook everything it has installed
UnhookWindowsHookEx(msgHook);

return 0;
}

Вы можете посмотреть определение функции перехвата в MSDN, но это может выглядеть так:

LRESULT CallWndRetProc(int nCode, WPARAM wParam, LPARAM lParam){

  CWPRETSTRUCT* theMessage = (CWPRETSTRUCT*)lParam;

  //now you can read all message parameters and the return value
  //...

  //Always return by calling the next hook in the chain
  return CallNextHookEx(0, nCode, wParam, lParam);
}

Другие хуки, которые вы хотите установить, следуют тому же принципу.

Смотри также

...