2)主動方式:
即是根據我們自己的需要,按需調用joyGetPos或joyGetPosEx方法查詢獲取某個游戲手柄的當前狀態 。
而在本篇中,我們要講解的只是“被動方式”。
joySetCapture方法的C#定義原型如下:
/// <summary>
/// 向系統申請捕獲某個游戲桿並定時將該設備的狀態值通過消息發送到某個窗口
/// </summary>
/// <param name="hWnd">窗口句柄</param>
/// <param name="uJoyID">指定游戲桿(0-15),它可以是JOYSTICKID1或 JOYSTICKID2</param>
/// <param name="uPeriod">每隔給定的輪詢間隔就給應用程序發送有關游戲桿的信 息。這個參數是以毫妙為單位的輪詢頻率。</param>
/// <param name="fChanged">是否允許程序當操縱桿移動一定的距離後才接受消息 </param>
/// <returns></returns>
[DllImport("winmm.dll")]
public static extern int joySetCapture(IntPtr hWnd, int uJoyID, int uPeriod, bool fChanged);
當我們調用此方法向系統申請捕獲某個游戲手柄後,如果成功,則返回JOYERR_NOERROR(值為0),否則 返回其它值的話表示申請失敗。並且在不再需要捕獲游戲手柄時要記得調用joyReleaseCapture方法釋放 捕捉。
如果申請成功,系統將會定時(根據uPeriod的值決定時間的長短)將游戲手柄的狀態以消息包形式發 送到hWnd對應的窗口界面。所以我們必須要在程序中處理對應的消息(如重寫WndProc方法進行處理)。
並且根據不同的uJoyID值,系統發送的消息號又會有所不同,如對於JOYSTICKID1系統將會分別發送以 下消息包:
消息號 說明 MM_JOY1MOVE 當手柄的位置已變動或按了某些按鈕時,將會發送此消息包。 MM_JOY1BUTTONDOWN 當手柄的A,B,C,D四個按鈕中的一個或多個正被按下時,將會發送此消 息包。 MM_JOY1BUTTONUP 當手柄的A,B,C,D四個按鈕中的一個或多個正被彈起時,將會發送此消 息包。而對於JOYSTICKID2 系統發出的消息包分別為MM_JOY2MOVE、MM_JOY2BUTTONDOWN、MM_JOY2BUTTONUP!
並且要注意!不管你有沒有按游戲手柄上的按鈕,系統也會定時發送MM_JOYXMOVE消息!!
怎樣判斷按了哪些鍵?
在消息包中,游戲手柄的狀態信息(按鈕狀態)分別存儲在消息包中的WParam與LParam參數。
1)WParam參數:
對於游戲手柄來說WParam存儲的是除了上下左右四個方向鍵之外的所有按鈕中當前被按下的按鈕值, 它的值是一個復合值。如它的值為JOY_BUTTON1 | JOY_BUTTON2時,就表明按下的按鍵是1號和2號按鈕。
注意:對於MM_JOYXBUTTONDOWN與MM_JOYXBUTTONUP兩個消息,用於判斷的按鈕值是不同於MM_JOYXMOVE 的按鈕值!!