2015-08-28 97 views
0

我使用C++和DirectD3D9來繪製菜單。 我希望用鼠標導航菜單。 我可以得到鼠標位置,但是,檢查左按鈕是否被點擊是棘手的。 我能夠檢查它是否被按下,但沒有被點擊。低級別鼠標鉤 - 鼠標按鈕點擊vs按住

bool LBUTTONDOWN = false; 
LRESULT CALLBACK LowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam) { 
    if (nCode == HC_ACTION && (wParam == WM_LBUTTONUP || wParam == WM_LBUTTONDOWN)) { 
     LBUTTONDOWN = wParam == WM_LBUTTONDOWN; 
    } 
    return CallNextHookEx(0, nCode, wParam, lParam); 
} 

如何添加支票以查看我是否點擊了左側按鈕?

+0

看看DirectInput。這對檢查鍵盤/鼠標/控制器狀態很有用 – cppguy

+0

使用DirectInput for鍵盤和鼠標多年來一直非常沮喪。上一次它是鍵盤/鼠標的一個好選擇是Windows 9x/ME。 –

回答

0

您需要使用計時技巧。創建一個名爲'nTime'的變量, 當LButton啓動時爲其設置零。當LButton關閉時,使用'+ ='操作符增加變量值,並檢查變量與某個值類似 -

bool LBUTTONDOWN = false; 
int nTime = 0; 
LRESULT CALLBACK LowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam) 
{ 
    if (nCode == HC_ACTION && (wParam == WM_LBUTTONUP || wParam == WM_LBUTTONDOWN)) 
    { 
     LBUTTONDOWN = wParam == WM_LBUTTONDOWN; 

     if (LBUTTONDOWN) 
     { 
      nTime += 1; 
      if (nTime > 1000 /*(this value depends on you)*/) 
      { 
       nTime = 0; 
       // Here is your hold event code. 
      } 
     } 
     else 
      nTime = 0; 
    } 
    return CallNextHookEx(0, nCode, wParam, lParam); 
} 
0

LowLevelMouseProc沒有DoubleClick消息。但是,我想你可以有一個工作:

記錄LBUTTONDOWN和LBUTTONUP之間的時間間隔,然後檢查它是否足夠快是一個點擊事件。而且由於鼠標動作非常快,最好爲鼠標捕捉設置一個計時器。

對於鼠標捕捉,您仍然可以調用LowLevelMouseProc。但是,DirectInput更便於處理鼠標移動。

在DirectX SDK示例中,有一個名爲「CustomFormat」的DirectInput示例。它顯示瞭如何設置一個計時器來捕獲鼠標輸入。

我希望這會有所幫助。