• 締切済み

DirectInputについて

C++でDirectinputの事なのですが。 デバッグには成功するのに、起動した後すぐ強制終了してしまいます。 VOID KeyCheck() { BYTE KeyState[256]; HRESULT hr; hr = g_lpDIDevice->GetDeviceState(256,KeyState); if (SUCCEEDED(hr)) { if (KeyState[DIK_LEFT]&0x80) muki=0; } else hr = g_lpDIDevice->Acquire(); } directxの勉強に簡単なものを書いてみようと思ったのですが、どの辺りがいけないのでしょうか?

noname#142252
noname#142252

みんなの回答

回答No.2

 こんばんは。最近ダイレクトインプットの質問が良く挙がります。  コードに問題は無い様です。  ただ、気に成るのは  hr = g_lpDIDevice->Acquire();  の呼び出している位置です。  此れを呼び出すのは「WM_ACTIVATE」等の中です。連続して呼び出す事はしません。  また、このKeyCheck関数はアイドリング内かマルチスレッド内に置かないといけません。そうしないと、入力の検出を継続する事が出来ないのです。  「ダイレクトインプット(ジョイスティック)」  http://oshiete1.goo.ne.jp/qa4309586.html

noname#142252
質問者

お礼

ご回答ありがとうございます。 directxは初めて2週間くらいで(C++も)まだまだサッパリです>< ただ、この問題は解決することができました(強制終了が出なくなっただけですけど・・・)。 参考を元に入力検出もできるように頑張ります。

  • Gizensha
  • ベストアンサー率34% (207/608)
回答No.1

> hr = g_lpDIDevice->GetDeviceState(256,KeyState); | hr = g_lpDIDevice->GetDeviceState(256,&KeyState); のような気がしますが、気がするだけです。

関連するQ&A

  • DirectInputについて再

    前に回答してくださった方すみません。 directinputで、デバックに成功して実行してみるとすぐに強制終了してしまう問題なのですが。 VOID KeyCheck() { BYTE KeyState[256]; HRESULT hr; hr = g_lpDIDevice->GetDeviceState(256,KeyState); if (SUCCEEDED(hr)) { if (KeyState[DIK_LEFT]&0x80) muki=0; } } 強制終了が出なくなったのはこの処理が実行されていなかっただけらしく、まだおかしいみたいなんです。 hr = g_lpDIDevice->GetDeviceState(256,KeyState); この文辺りが怪しいと思って256をsizeof(KeyState)にしたりなどいろいろなサイトで違った方法を試したりなどしたのですが、解決しませんでした。 OSはVistaの32bitなのですが、どのようにすれば治るでしょうか?

  • DirectInputが上手く動きません;

    DirectInputを使って操作は正しく取得できるようになったのですが、 つぎはぎで最低限動く所にこぎつけただけで 色々問題が有ります・・orz 1.フォーカスを別アプリに移して戻すと、一切操作を受付けなくなる。 2.Unacquire(); を入れなければならないらしいけれど、入れるべき場所が解らない 3.動かしてみる度に、マウス座標の受け取りが劣悪な程遅くなってくる。。 コードは大よそ以下のようになっています。 どこか怪しい部分がわかる方が推察できる方がいらっしゃいましたら ご指摘願います、その部分のコード全体を書き出そうと思います。 よろしくお願い致します。 orz --------------------------------- //●Inputクラス 初期化用関数内 DirectInput8Create(); //オブジェクト作成 lpDI lpDI->CreateDevice(); //マウス用作成 lpDIDeviceM lpDIDeviceM->SetDataFormat(); lpDIDeviceM->SetCooperativeLevel() lpDIDeviceM->Acquire(); lpDI->CreateDevice(); //キーボード用作成 lpDIDeviceK lpDIDeviceK->SetDataFormat(); lpDIDeviceK->SetCooperativeLevel() lpDIDeviceK->Acquire(); //●Inputクラス マウス用状態取得関数内(キーボードも同じ構造です) DIMOUSESTATE dims; HRESULT hr2; hr2 = lpDIDeviceM->GetDeviceState( sizeof(DIMOUSESTATE), &dims ); if (hr2==DIERR_INPUTLOST) { g_lpDIDeviceM->Acquire(); } else if (SUCCEEDED(hr2)) {  // 受け取り処理 } //●Inputクラス デストラクタ処理 //Unacquire();をすべき場所はここなのでしょうか SAFE_RELEASE( lpDIDeviceK ); SAFE_RELEASE( lpDIDeviceM ); SAFE_RELEASE( lpDI ); ---------------------------------

  • DirectInputオブジェクト

    最近DirectXプログラミングをやり始めた者です。 DirectInputオブジェクトを作成しようと次のようなプログラムを書いたのですがうまく作成できません。 LPDIRECTINPUT8 g_pDI; DirectInput8Create(GetModuleHandle(NULL), DIRECTINPUT_VERSION, IID_IDirectInput8, (void**)&g_pDI, NULL)); 開発環境は WinXP Pro Visual Studio 2005 Pro DirectX SDK (April 2007) です。

  • BHO-3

    いつもお世話になっています。 STDMETHODIMP CHelloWorldBHO::SetSite(IUnknown* pUnkSite) { HRESULT hr = S_OK; if (m_pSite != NULL){ m_pSite->Release(); m_pSite = NULL; } if (pUnkSite != NULL) { IHTMLDocument3 *pDocument3; HRESULT hr2 = pUnkSite->QueryInterface(IID_IHTMLDocument3, (void **)&pDocument3); if (SUCCEEDED(hr2)){ PutEventHandler(pDocument3); } ////////////////////////////// // IWebBrowser2 へのポインタをキャッシュします。 HRESULT hr = pUnkSite->QueryInterface(IID_IWebBrowser2, (void **)&m_spWebBrowser); if (SUCCEEDED(hr)) { // DWebBrowserEvents2 からのイベントをシンクに登録します。 hr = DispEventAdvise(m_spWebBrowser); if (SUCCEEDED(hr)) { m_fAdvised = TRUE; } } 上のコードの IHTMLDocument3 *pDocument3; HRESULT hr2 = pUnkSite->QueryInterface(IID_IHTMLDocument3, (void **)&pDocument3); if (SUCCEEDED(hr2)){ PutEventHandler(pDocument3); } ですが、 HRESULT hr2 = pUnkSite->QueryInterface(IID_IHTMLDocument3, (void **)&pDocument3); の部分で失敗します。 HRESULT hr = pUnkSite->QueryInterface(IID_IWebBrowser2, (void **)&m_spWebBrowser); if (SUCCEEDED(hr)) { // DWebBrowserEvents2 からのイベントをシンクに登録します。 hr = DispEventAdvise(m_spWebBrowser); if (SUCCEEDED(hr)) { m_fAdvised = TRUE; } } が、上手く動くのでまねをしたのですが上手く行きません。 すみませんが、アドバイスお願いします。

  • DirectInput でのエラー

    LPDIRECTINPUT8 m_pDI; LPDIRECTINPUTDEVICE8 m_pJoystick; 省略 // ゲームコントローラーの列挙 if(FAILED(hr = m_pDI->EnumDevices(DI8DEVCLASS_GAMECTRL, EnumJoysticksCalback, NULL, DIEDFL_ATTACHEDONLY))) return hr; //********************************************************/ BOOL CALLBACK InputDevice::EnumJoysticksCallback(const DIDEVICEINSTANCE* pdidInstance, VOID* pContext ) { HRESULT hr; hr = m_pDI->CreateDevice(pdidInstance->guidInstance, &m_pJoystick, NULL); if(FAILED(hr)){ return DIENUM_CONTINUE; }else{ return DIENUM_STOP; } } ゲームコントローラーの列挙をするためのコードを msdn や DirectXSDK のサンプルを 参考に書きました。でもどうしても以下のようなエラーがでます。 キャストなど試してみましたが解決にはいたりませんでした。 どうかご教授おねがいします。 d:\○○△△.cpp(30) : error C2664: 'IDirectInput8A::EnumDevices' : 2 番目の引数を 'BOOL (const DIDEVICEINSTANCE *,void *)' から 'LPDIENUMDEVICESCALLBACKA' に変換できません。

  • 描画について

    サイズを綺麗に描画したいのですが(サイズの範囲(rightとbottom)が微妙にずれている)どうしたら描画できるでしょうか? ここら辺かな?と思うところを載せます。 HRESULT ReadBMP(ID3DXSprite** g_pSprite,LPCTSTR lpszFilename,DDXTEX* g_pTexture) { HRESULT hr = S_FALSE; UINT uLevel = 0; IDirect3DSurface9* pSurface = NULL; lstrcpy(g_pTexture->m_Filename,lpszFilename); g_pTexture->m_clrAlpha=g_colorKey; g_pTexture->m_pTexture=NULL; // スプライト情報の生成 if (SUCCEEDED(hr)) hr = ::D3DXCreateSprite(g_pd3dDevice, g_pSprite); if (SUCCEEDED(hr)) hr = ::D3DXCreateTextureFromFileEx(g_pd3dDevice, g_pTexture->m_Filename, 680, 460, 1, D3DUSAGE_RENDERTARGET, D3DFMT_UNKNOWN, D3DPOOL_DEFAULT, D3DX_DEFAULT, D3DX_DEFAULT, g_pTexture->m_clrAlpha, NULL, NULL, &g_pTexture->m_pTexture); if (SUCCEEDED(hr)) hr = g_pTexture->m_pTexture->GetSurfaceLevel(uLevel, &pSurface); // サーフェイス取得 if (SUCCEEDED(hr)) hr = pSurface->GetDesc(&g_sSurfaceInfo); if (pSurface != NULL) pSurface->Release(); pSurface = NULL; // 失敗したら破棄 if (FAILED(hr)) DestroySplite(*g_pSprite,g_pTexture); return hr; } よろしくお願いします。

  • XAudio2がNULLになってしまう

    はじめまして、DontacosM2と申します。 現在、DirectX を使用して ゲームアプリケーションの制作を行っています。 サウンド再生に XAudio2 を使用しているのですが、 実行ファイルを作成し、友人に渡したところサウンド部分が原因でアプリケーションが停止してしまい困っております。 以下、XAudio2 の初期化部分のソースコードです。 {    HRESULT hr;    unsigned int flag = 0;      //COMを初期化    CoInitializeEx(NULL, COINIT_MULTITHREADED);   #ifdef _DEBUG      // デバッグする時はフラグを立てるようにとの事    flag |= XAUDIO2_DEBUG_ENGINE;   #endif      hr = XAudio2Create(&g_pXaudio2, flag, XAUDIO2_DEFAULT_PROCESSOR);      if (SUCCEEDED(hr))    {       hr = g_pXaudio2->CreateMasteringVoice(&g_pMasteringVO, 0, 0, 0, 0, 0);       if(FAILED(hr))       {          //エラー処理       }    }    else    {       //エラー処理    }    return hr; } 自分のPCでコンパイルすると正常にクリエイトでき、サウンドも再生されるのですが、 友人のPCで、僕の作成したexeを実行すると XAudio2Create を行っているところで g_pXaudio2 がNULLになっているようで 以降、サウンドが鳴らない等の不具合が出ています。 DirectX SDK は August2009で、 Visual C++ 2008 Express を使用しています。 友人のPCにはSDKは入っておらず、ランタイムは今現在の最新のものです。 初期化部分に問題は無いと思うのですが・・・ 環境によって XAudio2Create が上手く動作しないという事があるのでしょうか? 宜しくお願いします。

  • DirectXのDIK発進について

    初めまして、お世話になります。 C#カテゴリがなく、DirectX関係なのでこちらに投稿させて頂きます。 C#で作成したフォームからDIK_LEFTの発信等は可能でしょうか? 現在目標としているものは「SendInput・SendKeyやkeybd_eventではなく、生身の人間がキーボードの"←"を押した状態を作る」といったものです。 DirectXやDirectInputで検索をかけてみたりはしたのですが、入力されたキー情報の判定等のサイトが多く、目的のもの(キー発信)が見つからず途方にくれておりました。 もし可能であればその方法、またはサイト等を教えて頂きたいです。 よろしくお願いします。

  • C++ でWindowsAPIを使用する際

    WindowsAPIを使用しようとしているのですが、エラーが出てうまくいきません。 もし原因が分かる方がいらっしゃれば、教えていただけると幸いです。 エラーコード: error C2787:: IFileOperation :このオブジェクトに関連付けられたGUIDがありません。 問題箇所: HRESULT CopyItem(__in PCWSTR pszSrcItem, __in PCWSTR pszDest, PCWSTR pszNewName) { // // Initialize COM as STA. // HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE); if (SUCCEEDED(hr)) { IFileOperation *pfo; // // Create the IFileOperation interface // hr = CoCreateInstance(CLSID_FileOperation, NULL, CLSCTX_ALL, IID_PPV_ARGS(&pfo));  //※ここでエラー発生  if (SUCCEEDED(hr)) { // // Set the operation flags. Turn off all UI from being shown to the // user during the operation. This includes error, confirmation, // and progress dialogs. // hr = pfo->SetOperationFlags(FOF_NO_UI); if (SUCCEEDED(hr)) { // // Create an IShellItem from the supplied source path. // IShellItem *psiFrom = NULL; hr = SHCreateItemFromParsingName(pszSrcItem, NULL, IID_PPV_ARGS(&psiFrom)); if (SUCCEEDED(hr)) { IShellItem *psiTo = NULL; if (NULL != pszDest) { // // Create an IShellItem from the supplied // destination path. // hr = SHCreateItemFromParsingName(pszDest, NULL, IID_PPV_ARGS(&psiTo)); } if (SUCCEEDED(hr)) { // // Add the operation // hr = pfo->CopyItem(psiFrom, psiTo, pszNewName, NULL); if (NULL != psiTo) { psiTo->Release(); } } psiFrom->Release(); } if (SUCCEEDED(hr)) { // // Perform the operation to copy the file. // hr = pfo->PerformOperations(); } } // // Release the IFileOperation interface. // pfo->Release(); } CoUninitialize(); } return hr; よろしくお願いします。

  • 共有体でfloat型の数値を2進数へ変換

    実行結果が思ったとおりの値を算出しません。 なぜでしょうか? 回答のほどよろしくお願いいたします。 (例) 小数入力 >5.0 0000 0000 0000 0000 0100 0000 1010 0000 小数入力 >-5.0 0000 0000 0000 0000 1100 0000 1010 0000 (下記ソース) #include<stdio.h> void float_binary(float a); void main (void) { float fl; printf("小数入力 >"); scanf("%f",&fl); float_binary(fl); } void float_binary(float a) { struct float_data{ short int high_byte; short int low_byte; }; union data{ float num; struct float_data bit; }DATA; int i; DATA.num = a; for(i = 0; i<16; i++){ if(i != 0 && i % 4 == 0){ printf(" "); } if(DATA.bit.high_byte < 0){ printf("1"); } else{ printf("0"); } DATA.bit.high_byte = DATA.bit.high_byte << 1; } for(i = 0; i<16; i++){ if(i % 4 == 0){ printf(" "); } if(DATA.bit.low_byte < 0){ printf("1"); } else{ printf("0"); } DATA.bit.low_byte = DATA.bit.low_byte << 1; } }