2015-09-19 43 views
0

這是我的代碼: -鼠標點擊向我發送消息多次在C++

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

也許當你點擊*關閉'MessageBox'時,你觸發了一個新的鼠標事件? – Galik

+0

當我點擊鼠標左鍵時,一旦所有消息框出現 –

+0

我不知道WINAPI,但它可能是'鼠標按下'和'鼠標按下'兩個事件嗎? – Zereges

回答

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它使用鼠標事件

+0

是的,這是一個線程。是否有任何其他捕捉鼠標事件的方式 –

+0

如果你的線程沒有供用戶進行交互的GUI,你有兩種選擇:1)使用'SetWindowsHookEx()'鉤住鼠標,或者2)給你的線程一個隱藏的窗口,然後使用'RegisterRawInputDevices()'讓鼠標發送'WM_INPUT'消息給它。 –

0

你的線程沒有。有一個供用戶交互的GUI,所以它的關鍵狀態不會被更新,每個線程都有它自己的關鍵狀態,它在UI消息處理過程中被更新。 GUI,你有兩種選擇:

  1. 使用SetWindowsHookEx()鉤住使用WH_MOUSEWH_MOUSE_LL鉤鼠標。線程將需要一個消息循環來處理鉤子。

  2. 讓你的線程創建一個隱藏窗口(和消息循環),然後使用RegisterRawInputDevices()讓鼠標發送WM_INPUT消息到你的窗口。