2015-06-17 43 views
0

如果某些用戶點擊了某個按鈕,如何正確檢查Windows?目前,我有以下點擊校驗碼:最可靠的鼠標點擊檢查

bool cButton::isCursorCrossing () const 
{ 
    int posx, posy; 
    g_pVGuiSurface->SurfaceGetCursorPos (posx, posy); 
    if (posx > m_render_x && posx < m_render_x + buttonSize) 
    { 
     if (posy > m_render_y && posy < m_render_y + buttonSize) 
     { 
      return true; 
     } 
    } 
    return false; 
} 

bool cButton::isClicked () const 
{ 
    if (isCursorCrossing ()) 
    { 
     if (GetAsyncKeyState (0x01) & 1) 
     { 
      return true; 
     } 
    } 
    return false; 
} 

但有時不工作 - 我必須單擊按鈕5至10倍,看結果,我認爲這是由GetAsyncKeyState造成的。

+3

這不是按鈕在Windows中的工作方式。當用戶點擊一個按鈕時,系統會排隊消息以指示事件已經發生。我不知道你爲什麼要使用'GetAsyncKeyState'。你會想把所有這些代碼扔掉,然後回到繪圖板。第1步是瞭解消息。 –

+0

@DavidHeffernan,但我沒有使用Windows窗體應用程序 - 它使用DX繪圖系統,並且我正在爲它創建插件 - 所以我沒有收到消息 – legitberg

+3

問題標籤爲winapi。也許你需要退後一步。編輯問題並提供有關您實際正在執行的操作的明確細節,併爲此代碼提供上下文。 –

回答

0

您需要切換到類似事件的系統,而不是輪詢。 GetAsyncKeyState會告訴你,在您調用它的那一刻,鼠標按鈕是否處於關閉狀態。如果用戶最近點擊過,它沒有內存可報告。所以它很自然地不能可靠地工作。你的應用程序沒有響應用戶的操作,只是偶然碰巧排隊。

Windows將消息發送到您的應用程序,以便您可以可靠地處理事件。在點擊鼠標按鈕的情況下,您的窗口將收到WM_LBUTTONDOWNWM_LBUTTONUP

要麼找到自己處理這些消息的方法,要麼找出你的框架如何將這些事件轉發給你。

0

那麼最可靠的是使用消息。操作系統在發生事件時發送消息,例如。發生鼠標點擊或鍵盤上的按鈕被按下/釋放。

所以,如果你看看「Windows消息循環」,你可能會喜歡答案。一開始我就要入門,但這對於Windows編程來說都是很好的知識。