2009年8月16日 星期日

如何在應用程式中分辨Mouse或Touch事件?

Windows 7的視窗應程式中, 不論你用mouse或是touch作click的動作, 應用程式都會收到WM_LBUTTONDOWNWM_LBUTTONUP事件. 如下面的Win32視窗程式所示,當收到滑鼠左鍵按下/放開的訊息時, 會跳出一個訊息視窗.

case WM_LBUTTONDOWN:
{

MessageBoxA(NULL, "Mouse left button down",0,0);    

};
break;

case WM_LBUTTONUP:
{

MessageBoxA(NULL, "Mouse left button up",0,0);

};
break;



                                                   [圖 1]滑鼠左鍵按下/放開



                                                       [圖 2]Touch下去/起來

從上面的圖示中看到, 不論你是用mousetouch作click, 都會收到滑鼠左鍵按下/放開的事件; 但是開發觸控應用程式時, 可能需要分辨出使用者是利用滑鼠作點擊(click), 還是利用手指作觸碰, 來作不同的設定. 因此, 我們可以在收到WM_LBUTTONDOWNWM_LBUTTONUP 時, 呼叫GetMessageExtraInfo()來判斷滑鼠事件是來自touch還是mouse, 程式碼如下所示:

1. 定義滑鼠事件來自touch的訊息, 如下所示:
#define MOUSEEVENTF_FORMTOUCH 0xFF515700


2. 利用GetMessageExtraInfo函式作判斷, 如下所示:

case WM_LBUTTONDOWN:
{
if((GetMessageExtraInfo() & MOUSEEVENTF_FORMTOUCH)
== MOUSEEVENTF_FORMTOUCH)
{
MessageBoxA(NULL, "Click was generated by Touch",0,0);
}
else
{
MessageBoxA(NULL, "Click was generated by Mouse Click",0,0);
}

};
break;

case WM_LBUTTONUP:
{
if((GetMessageExtraInfo() & MOUSEEVENTF_FORMTOUCH)
== MOUSEEVENTF_FORMTOUCH)
{
MessageBoxA(NULL, "Click was generated by Touch",0,0);
}
else
{
MessageBoxA(NULL, "Click was generated by Mouse Click",0,0);
}
};
break;



結果如下面圖示:


                                                       [圖 3]滑鼠左鍵按下/放開



                                                          [圖 4] Touch下去/起來

沒有留言:

張貼留言