我正在尝试捕获全局鼠标和键盘输入.
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",但只要我点击鼠标右键,就会打印"鼠标右键/向上".这使我得出结论,我MouseHookProc在PeekMessage呼叫期间被调用.它恰好是某种特殊的消息,并PeekMessage返回0.但我仍然需要打电话PeekMessage或一些等价物.
由于我的程序需要做很多事情,我显然不能通过PeekMessage …
我正在创建一个控制台应用程序,我想记录按键(如向上箭头).我已经创建了一个低级键盘挂钩,它应该捕获任何线程中的所有按键并调用我的回调函数,但它不起作用.当我按下一个键时程序停止了一段时间,但从不调用回调.我检查了文档,但没有找到任何东西.我不知道我是否错误地使用了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) 我正在为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) 我一直在尝试使用以下代码为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++ ×3
hook ×2
capture ×1
console ×1
delphi ×1
delphi-2007 ×1
key ×1
message-loop ×1
winapi ×1