2014-05-19 72 views
-2

使用操縱桿編寫一個小程序,我很難理解joyGetPos()的工作原理,而joyGetPosEx()不能。爲什麼joyGetPos有效,而joyGetPosEx不會呢?

我做了一些使用C++的基本程序,這是我第一個使用遊戲杆的項目。

平臺:Windows 7的64位

搖桿:在操縱桿上的功能http://www.thrustmaster.com/en_UK/products/hotas-cougar

文件:http://msdn.microsoft.com/en-us/library/windows/desktop/dd757121(v=vs.85).aspx

代碼JOYINFO

#include <iostream> 
#include <stdio.h> 
#include <string> 
#include <Windows.h> 


int main(int argc, char** argv) 
{ 
    while (true) 
    { 
     unsigned int num_dev = joyGetNumDevs(); 

     if (0 == num_dev) 
     { 
      std::cout << "[ERROR ] num_dev == 0" << std::endl; 
     } 

     /* JOYINFO */ 

     // retreiving the joystick values 
     JOYINFO joyinfo; 
     MMRESULT joygetpos_result = joyGetPos(JOYSTICKID1, &joyinfo); 

     // if tested, joygetpos_result does not produce any error 

     // values change when playing with the stick 
     std::cout << "joinfo.wXpos = " << joinfo.wXpos << std::endl; 
     std::cout << "joinfo.wYpos = " << joinfo.wYpos << std::endl; 
    } 
} 

這個版本是相當不錯,但大灰帽和18箇中的4個按鈕不起作用。

代碼JOYINFOEX

#include <iostream> 
#include <stdio.h> 
#include <string> 
#include <Windows.h> 


int main(int argc, char** argv) 
{ 
    while (true) 
    { 
     unsigned int num_dev = joyGetNumDevs(); 

     if (0 == num_dev) 
     { 
      std::cout << "[ERROR ] num_dev == 0" << std::endl; 
     } 


     /* JOYINFOEX */ 
     // retreiving the joystick values 
     JOYINFOEX joyinfoex; 
     MMRESULT joygetposex_result = joyGetPosEx(JOYSTICKID1, &joyinfoex); 


     // error always produced 
     if (joygetposex_result == JOYERR_PARMS) 
     { 
      std::cout << "[ERROR ] JOYERR_PARMS" << std::endl; 
     } 

     // values does not change when playing with the stick 
     std::cout << "joinfoex.dwXpos = " << joinfoex.dwXpos << std::endl; 
     std::cout << "joinfoex.dwYpos = " << joinfoex.dwYpos << std::endl; 

} 

這第二個版本總是產生JOYERR_PARMS錯誤。我試圖將JOYSTICKID1從1改爲15,但沒有任何成功。我認爲我沒有正確使用Windows功能,但不幸的是,我無法理解使用它的正確方法。

您是否面對同樣的問題?我使用良好的API來使用這種遊戲杆嗎?

感謝您的幫助。

+3

RTFM:「您必須設置dwSize和dwFlags成員或joyGetPosEx將失敗。」 –

回答

3

MSDN page on joyGetPosEx

指向包含伸出位置信息和操縱桿的按鈕狀態的JOYINFOEX結構。您必須設置dwSize和dwFlags成員或joyGetPosEx將失敗。

您將需要使用大小和標誌填充變量joyinfoex。

joyinfoex.dwSize = sizeof(joyinfoex); 
joyinfoex.dwFlags = JOY_RETURNALL; 
+0

哦好吧好吧。謝謝,現在看起來非常清楚,但是這部分文檔對我來說非常模糊!我不習慣將「我想要的」設置到函數返回的一個對象中。再次感謝。 – NoonanRosenblum

+0

你必須習慣它 - 許多WinAPI就是這樣。只要總是仔細閱讀每個WinAPI函數的文檔而不做任何假設。 – theosza

相關問題