相关疑难解决方法(0)

了解低级鼠标和键盘钩子(win32)

我正在尝试捕获全局鼠标和键盘输入.

LRESULT CALLBACK MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam) {
  if (nCode >= 0) {
    if (wParam == WM_RBUTTONDOWN) printf("right mouse down\n");
    if (wParam == WM_RBUTTONUP) printf("right mouse up\n");
  }
  return CallNextHookEx(0, nCode, wParam, lParam);
}

HHOOK mousehook = SetWindowsHookEx(WH_MOUSE_LL, MouseHookProc, NULL, 0);
while(true) {
  MSG msg;
  if (PeekMessage(&msg,0,0,0,PM_REMOVE)) {
    printf("msg recvd\n");
    TranslateMessage(&msg);
    DispatchMessage(&msg);
  }
#ifdef TEST
  Sleep(50);
#endif
}
Run Code Online (Sandbox Code Playgroud)

所以一切都在这里工作,除非我#define TEST放入Sleep,鼠标变得非常迟钝,如果我突然只允许鼠标每秒更新20次,可能会出现这种情况.没有睡眠,我将CPU固定在100%.但是现在这没关系(如果我使用的话就会消失GetMessage).

根据我的理解,低级钩子通过上下文切换到安装它的进程,然后发送进程某种消息让它执行钩子回调.令我困惑的是,为什么我的程序永远不会打印"msg recvd",但只要我点击鼠标右键,就会打印"鼠标右键/向上".这使我得出结论,我MouseHookProcPeekMessage呼叫期间被调用.它恰好是某种特殊的消息,并PeekMessage返回0.但我仍然需要打电话PeekMessage或一些等价物.

由于我的程序需要做很多事情,我显然不能通过PeekMessage …

c++ winapi multithreading

13
推荐指数
2
解决办法
2万
查看次数

C++ SetWindowsHookEx WH_KEYBOARD_LL正确设置

我正在创建一个控制台应用程序,我想记录按键(如向上箭头).我已经创建了一个低级键盘挂钩,它应该捕获任何线程中的所有按键并调用我的回调函数,但它不起作用.当我按下一个键时程序停止了一段时间,但从不调用回调.我检查了文档,但没有找到任何东西.我不知道我是否错误地使用了SetWindowsHookEx()(据我所知它成功创建了钩子)或者我的回调函数是不正确的!我不确定什么是错的!在此先感谢您的帮助.

#include "Windows.h"
#include <iostream>
using namespace std;

HHOOK hookHandle;

LRESULT CALLBACK keyHandler(int nCode, WPARAM wParam, LPARAM lParam);

int _tmain(int argc, _TCHAR* argv[]) {

 hookHandle = SetWindowsHookEx(WH_KEYBOARD_LL, keyHandler, NULL, 0);

 if(hookHandle == NULL) {
  cout << "ERROR CREATING HOOK: ";
  cout << GetLastError() << endl;
  getchar();
  return 0;
 }

 MSG message;

 while(GetMessage(&message, NULL, 0, 0) != 0) {
  TranslateMessage( &message );
  DispatchMessage( &message );
 }

 cout << "Press any key to quit...";
 getchar();

 UnhookWindowsHookEx(hookHandle);

 return 0;
}


LRESULT CALLBACK keyHandler(int …
Run Code Online (Sandbox Code Playgroud)

c++ hook key capture setwindowshookex

5
推荐指数
1
解决办法
1万
查看次数

如何终止具有单独消息循环的线程?

我正在为SetWindowsHookExAPI 编写一个实用程序单元.

要使用它,我想要一个这样的界面:

var
  Thread: TKeyboardHookThread;
begin
  Thread := TKeyboardHookThread.Create(SomeForm.Handle, SomeMessageNumber);
  try
    Thread.Resume;
    SomeForm.ShowModal;
  finally
    Thread.Free; // <-- Application hangs here
  end;
end;
Run Code Online (Sandbox Code Playgroud)

在我当前的实现中,TKeyboardHookThread我无法正确退出线程.

代码是:

  TKeyboardHookThread = class(TThread)
  private
    class var
      FCreated                 : Boolean;
      FKeyReceiverWindowHandle : HWND;
      FMessage                 : Cardinal;
      FHiddenWindow            : TForm;
  public
    constructor Create(AKeyReceiverWindowHandle: HWND; AMessage: Cardinal);
    destructor Destroy; override;
    procedure Execute; override;
  end;

function HookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
var
  S: KBDLLHOOKSTRUCT;
begin
  if nCode < 0 then begin
    Result …
Run Code Online (Sandbox Code Playgroud)

delphi multithreading delphi-2007 message-loop

4
推荐指数
1
解决办法
1173
查看次数

如何在Win32控制台窗口上设置CBT挂钩?

我一直在尝试使用以下代码为C ++控制台应用程序设置CBT挂钩:

 ...includes...

 typedef struct _HOOKDATA
 {
    int type;
    HOOKPROC hookproc;
    HHOOK hhook;
 }_HOOKDATA;

 _HOOKDATA hookdata;

 //CBT
 LRESULT CALLBACK CBTProc(int code, WPARAM wParam, LPARAM lParam)
 { 
    //do not proccess message
    if(code < 0)
    {
       cout<<"code less than 0"<<endl;
       return CallNextHookEx(hookdata.hhook,code,wParam,lParam);
    }

    switch(code)
   {
      case HCBT_ACTIVATE:
           break;
      case HCBT_CREATEWND:
           cout<<"CREATEWND"<<endl;
           break;
      case HCBT_MINMAX:
           cout<<"MINMAX"<<endl;
           break;
      default: //unknown
           cout<<"DEFAULT"<<endl;
           break;
   }

   return CallNextHookEx(hookdata.hhook, code, wParam, lParam);
}

int main()
{
   hookdata.type = WH_CBT; 
   hookdata.hookproc = CBTProc; 
   hookdata.hhook = ::SetWindowsHookEx(hookdata.type, CBTProc, 
                                    GetModuleHandle( 0 …
Run Code Online (Sandbox Code Playgroud)

c++ console hook

3
推荐指数
1
解决办法
2451
查看次数