这是我的代码: -
DWORD WINAPI ThreadMouse(void* data){
while (1){
//Check the mouse left button is pressed or not
if ((GetKeyState(VK_LBUTTON) & 0x8000) != 0)
{
MessageBox(NULL, L"Left Clicked", L"", NULL);
break;
}
//Check the mouse right button is pressed or not
if ((GetKeyState(VK_RBUTTON) & 0x100) != 0)
{
MessageBox(NULL, L"Right Clicked", L"", NULL);
break;
}
}
return 0;
}
我收到的邮件多次而不是一次
答案 0 :(得分:1)
这看起来像一个线程,它会轮询鼠标的状态。
不会发生鼠标事件。
Windows可以接收活动。
我有一个项目: -
class CImageDisplay :
public wxScrolledWindow,
public IToolTarget
{
/// omitted
void OnMouseDClick( wxMouseEvent& mouseEvent );
void OnMouseUp( wxMouseEvent& mouseEvent );
};
wxScrolledWindow
来自wxWindow。
这声明了鼠标事件的功能。
在cpp文件中,我有......
BEGIN_EVENT_TABLE(CImageDisplay, wxScrolledWindow)
EVT_MOTION(CImageDisplay::OnMouseMove )
EVT_LEFT_DOWN(CImageDisplay::OnMouseDown )
EVT_LEFT_DCLICK(CImageDisplay::OnMouseDClick )
EVT_LEFT_UP(CImageDisplay::OnMouseUp )
// omitted
END_EVENT_TABLE()
这告诉wx在事件发生时调用我的函数(EVT_*
)。
然后我可以跟踪鼠标事件的发生,但是否则我的代码没有做任何事情。
查看wx文档(例如wx documentation mouse events了解可用的事件以及它们有哪些限制。
查看样本 - 例如plot.cpp使用鼠标事件。
答案 1 :(得分:0)
您的线程没有供用户进行交互的GUI,因此其密钥状态永远不会更新。每个线程都有自己的密钥状态,在UI消息处理过程中会更新。
如果要在没有GUI的线程中监视鼠标,则有两种选择:
使用SetWindowsHookEx()
使用WH_MOUSE
或WH_MOUSE_LL
挂钩来挂钩鼠标。该线程需要一个消息循环来为钩子提供服务。
让您的线程创建一个隐藏窗口(和消息循环),然后使用RegisterRawInputDevices()
让鼠标向您的窗口发送WM_INPUT
消息。