我遇到了我正在编写的应用程序,我需要监视鼠标点击.
点击可能发生在屏幕上的任何地方,而不是在应用程序窗口内,对于每次点击,我必须传递消息(执行操作或其他内容).
我环顾四周,阅读了一些像使用的建议
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
Run Code Online (Sandbox Code Playgroud)
但我没有成功.
有没有人知道如何实现我需要的东西?
Eug*_*its 10
您需要按照MSDN中的说明设置鼠标挂钩.
请注意,在您的情况下,钩子需要是全局的.这意味着您需要在DLL中实现处理函数,该函数将被加载到系统中接收鼠标消息的所有进程中.这样的DLL将使用某些进程间通信(IPC)机制(如共享内存)或通过从DLL 发布(未发送)到主应用程序的Windows消息与主应用程序进行通信.
您可以使用此CodeProject文章中的源代码作为指南.
更新:根据Chris的更正,我应该注意上面适用于同步的"常规"鼠标钩子.低级挂钩不需要位于DLL中,但它具有某些限制,这些限制在相应的MSDN文章中有所描述.
小智 6
好吧,我真的不知道你是否解决了你的问题.希望如此.但是今天我遇到了同样的麻烦并且搜索我找到了一种非常容易实现的方法.
所以你在这里:
int keyPressed(int key){
return (GetAsyncKeyState(key) & 0x8000 != 0);
}
int main(){
while(1){
if(keyPressed(VK_LBUTTON)){
printf("%s\n","Click izquierdo");
}
if(keyPressed(VK_RBUTTON)){
printf("%s\n","Click Derecho");
}
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这个解决方案的关键是函数GetAsyncKeyState(key),其中键出这里出现的任何代码https://msdn.microsoft.com/en-us/library/dd375731(VS.85).aspx
你可以使用SetWindowsHookEx
这是一个小样本:
#define _WIN32_WINNT 0x0500
#include <windows.h>
HHOOK MouseHook;
LRESULT CALLBACK MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam){
PKBDLLHOOKSTRUCT k = (PKBDLLHOOKSTRUCT)(lParam);
POINT p;
if(wParam == WM_RBUTTONDOWN)
{
// right button clicked
GetCursorPos(&p);
}
}
void StayAlive(){
while(_getch() != 27) { }
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nShowCmd){
FreeConsole();
MouseHook = SetWindowsHookEx(WH_MOUSE_LL,MouseHookProc,hInstance,0);
StayAlive();
UnhookWindowsHookEx(MouseHook);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
26588 次 |
| 最近记录: |