前に回答してくださった方すみません。
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なのですが、どのようにすれば治るでしょうか?
No.4ベストアンサー
- 回答日時:
こんばんは。
前回回答した者です。えぇと、拝見させて頂きました。グローバル変数がパラメータの名前になっていたりと、大分怪しい所だらけなのですが、「g_pKeyboard->SetCooperativeLevel」で強調レベルを設定した後の「g_pKeyboard->SetProperty」が抜けています。其の外にも「WM_ACTIVATE」を処理していない為、制御権の獲得が出来て居ない状態です。この状態での動作は絶望的かと。以下修正品です。どの様にするのかを参考程度に見て下さい。
LPDIRECTINPUT8g_pDI;
LPDIRECTINPUTDEVICE8g_pKeyboard;
intmuki;
//此れは要らないのでは?
HRESULT InitD3D(HWND hWnd)
{
return DI_OK;
}
//ジオメトリ?
HRESULT InitGeometry()
{
return DI_OK;
}
//レンダリングして下さい
void Render()
{
}
//-----------------------------------------------------------------------------
BOOL DI_Init(HWND hWnd, HINSTANCE hInst)
{
HRESULT hr = DirectInput8Create(hInst, DIRECTINPUT_VERSION, IID_IDirectInput8, (void**)&g_pDI, NULL);
if(FAILED(hr))
return FALSE;
hr = g_pDI->CreateDevice(GUID_SysKeyboard, &g_pKeyboard, NULL);
if(FAILED(hr))
return FALSE;
hr = g_pKeyboard->SetDataFormat(&c_dfDIKeyboard);
if(FAILED(hr))
return FALSE;
hr = g_pKeyboard->SetCooperativeLevel(hWnd, DISCL_NONEXCLUSIVE | DISCL_FOREGROUND);
if(FAILED(hr))
return FALSE;
//キーボードの設定
//↓此れを設定しないといけません
DIPROPDWORD dipdw;
dipdw.diph.dwSize = sizeof(DIPROPDWORD);
dipdw.diph.dwHeaderSize = sizeof(DIPROPHEADER);
dipdw.diph.dwObj = 0;
dipdw.diph.dwHow = DIPH_DEVICE;
dipdw.dwData = 8;
hr = g_pKeyboard->SetProperty(DIPROP_BUFFERSIZE, &dipdw.diph);
//↑此処まで
return SUCCEEDED(hr);
}
//-----------------------------------------------------------------------------
VOID KeyCheck()
{
if(!g_pKeyboard)
return;
BYTE KeyState[256];
HRESULT hr = g_pKeyboard->GetDeviceState(256,KeyState);
if(FAILED(hr))
{
return;
}
if(KeyState[DIK_RIGHT]&0x80)
{
muki++;
::MessageBox(0, L"右ボタンが押された", L"入力テスト", MB_OK);
}
}
LRESULT CALLBACK MsgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
case WM_CREATE:
{
return TRUE;
}
case WM_CLOSE:
{
::DestroyWindow(hWnd);
return FALSE;
}
case WM_DESTROY:
{
::PostQuitMessage(0);
return FALSE;
}
case WM_ACTIVATE:
{
if(!g_pKeyboard)
break;
//制御権の切り替え
if(wParam == WA_INACTIVE)
{
g_pKeyboard->Unacquire();
}
else
{
g_pKeyboard->Acquire();
}
return FALSE;
}
}
return ::DefWindowProc(hWnd, uMsg, wParam, lParam);
}
INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, INT )
{
MSG msg;
WNDCLASSEX wc= {sizeof(WNDCLASSEX)};
wc.lpszClassName= L"D3D Tutorial";
wc.lpfnWndProc= MsgProc;
wc.style= CS_HREDRAW | CS_VREDRAW;
wc.hInstance= hInst;
wc.hIcon= LoadIcon(hInst,L"IDI_APPICON");
wc.hCursor= LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground= (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName= NULL;
wc.cbClsExtra= 0;
wc.cbWndExtra= 0;
if(!RegisterClassEx(&wc))
return FALSE;
HWND hWnd = CreateWindow( L"D3D Tutorial", L"D3D Tutorial 06: Meshes", WS_OVERLAPPEDWINDOW, 100, 100, 300, 300,NULL, NULL, wc.hInstance, NULL );
ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd);
if(FAILED(InitD3D(hWnd)))
return 0;
if(FAILED(InitGeometry()))
return 0;
if(FAILED(DI_Init(hWnd, hInst)))
return 0;
//此処で権利を獲得する
g_pKeyboard->Acquire();
while(TRUE)
{
if(::PeekMessage(&msg, 0, 0, 0, PM_NOREMOVE))
{
if(!::GetMessage(&msg, NULL, 0, 0))
break;
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
else //アイドリング
{
KeyCheck();
Render();
}
}
UnregisterClass( L"D3D Tutorial", wc.hInstance );
return 0;
}
No.3
- 回答日時:
g_hInstとg_hWndはグローバルで宣言されているのですよね
DI_Init() の
hr = DirectInput8Create(g_hInst, DIRECTINPUT_VERSION, IID_IDirectInput8, (void**)&g_pDI, NULL);
でg_hInstが初期化状態のままだと思われます。
FALSE(0)で返しているのをSUCCEEDED(>=0)で判定しているのでチェックできていません。
INT WINAPI wWinMain( HINSTANCE g_hInst, HINSTANCE, LPWSTR, INT )
を
INT WINAPI wWinMain( HINSTANCE hInst, HINSTANCE, LPWSTR, INT )
にして
g_hInst = hInst;
をwWinMain( )内に追加しましょう。
それとグローバルで宣言しているなら
HWND g_hWnd = CreateWindow( L"D3D Tutorial", L"D3D Tutorial 06: Meshes",
のHWNDを削除しましょう。
No.2
- 回答日時:
昔自分が作ったプログラムのソースを見てみたら以下のような処理をしていました
hr = g_lpDIDevice->Acquire();
if (hr == DI_OK || hr == S_FALSE)
{
hr = g_lpDIDevice->GetDeviceState( 256, KeyState);
if (SUCCEEDED(hr))
{
if (KeyState[DIK_LEFT]&0x80) muki=0;
}
}
情報取得前にAcquireしてみたらどうでしょう
No.1
- 回答日時:
その部分だけ出されてもどうにもならないんだけど?
落ちてる部分やそれが関連するソース、ないし以前の質問とやらの番号を提示するべきじゃないかな。
このソースだけだと普通にしかみえない。
この回答への補足
以前の質問はこれですね
http://okwave.jp/qa4310890.html?ans_count_asc=20
INT WINAPI wWinMain( HINSTANCE g_hInst, HINSTANCE, LPWSTR, INT )
{
WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
L"D3D Tutorial", NULL };
RegisterClassEx( &wc );
HWND g_hWnd = CreateWindow( L"D3D Tutorial", L"D3D Tutorial 06: Meshes",
WS_OVERLAPPEDWINDOW, 100, 100, 300, 300,
NULL, NULL, wc.hInstance, NULL );
if( SUCCEEDED( InitD3D( g_hWnd ) ) )
{
if( SUCCEEDED( InitGeometry() ) )
{
if( SUCCEEDED( DI_Init() ) )
{
ShowWindow( g_hWnd, SW_SHOWDEFAULT );
UpdateWindow( g_hWnd );
MSG msg;
ZeroMemory( &msg, sizeof(msg) );
while( msg.message!=WM_QUIT )
{
if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
else
{
KeyCheck();
Render();
}
}
}
}
}
UnregisterClass( L"D3D Tutorial", wc.hInstance );
return 0;
}
//-----------------------------------------------------------------------------
BOOL DI_Init()
{
HRESULT hr;
hr = DirectInput8Create(g_hInst, DIRECTINPUT_VERSION,
IID_IDirectInput8, (void**)&g_pDI, NULL);
if FAILED(hr) return FALSE;
hr = g_pDI->CreateDevice(GUID_SysKeyboard, &g_pKeyboard, NULL);
if FAILED(hr) return FALSE;
hr = g_pKeyboard->SetDataFormat(&c_dfDIKeyboard);
if FAILED(hr) return FALSE;
hr = g_pKeyboard->SetCooperativeLevel(g_hWnd,
DISCL_FOREGROUND | DISCL_NONEXCLUSIVE);
if FAILED(hr) return FALSE;
hr = g_pKeyboard->Acquire();
if FAILED(hr) return FALSE;
return TRUE;
}
//-----------------------------------------------------------------------------
VOID KeyCheck()
{
BYTE KeyState[256];
HRESULT hr;
hr = g_pKeyboard->GetDeviceState(256,KeyState);
{
if (KeyState[DIK_RIGHT]&0x80) muki++;
}
}
wWinMainのKeyCheck();を消すと普通に動作しました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- HTML・CSS 下にスクロールしても、追従するボタンのコードを書いたのですが、ボタンの中の画像が半分しか表示されない 1 2022/04/16 21:31
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- MySQL php テーブルを作れない 2 2022/11/17 18:22
- PHP php テーブルが作成できない 1 2022/11/17 23:41
- C言語・C++・C# TCP/IP通信時のサーバーからの受信 2 2022/11/23 09:11
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- PHP PHP MySql ページング 2 2022/09/20 06:38
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- カスタマイズ(車) C-HR ホイールサイズについて!! 2 2022/10/20 07:59
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Win32APIにて、ウィンドウ全体...
-
ゲームとかの解像度変更&全画...
-
WM_CREATE について
-
Win32でシリアル通信
-
LoadImageを使用し、タイトルバ...
-
コンソールアプリケーションの...
-
C++のcase文の書き方
-
音量調節
-
LoadImageとSetCursorについて
-
Win32APIでウィンドウを中央に...
-
2÷3などの余りについて
-
Enterキーを押されたら次の処理...
-
信頼区間の1.96や1.65ってどこ...
-
マイナスからプラスへ転じた時...
-
fgetsなどのときのstdinのバッ...
-
*をユーザーが入力した数字の数...
-
C言語のfor文です。 繰り返しの...
-
C言語
-
「指定されたキャストは有効で...
-
float型とdouble型の変数の違い...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エディットボックスの背景の色...
-
ダイアログプログラムでEnterキ...
-
C言語win32api、エディットボッ...
-
音量調節
-
エディットコントロール入力時...
-
プログラミングでエラーが出ま...
-
エラー Run-Time Check Failur...
-
キャレットの現在位置の表示 (W...
-
LoadImageとSetCursorについて
-
コンソールアプリケーションの...
-
画像を表示したいのですが……
-
ボタンの色(WINAPI)
-
COMPORTマルチスレッドで例外発生
-
C++のcase文の書き方
-
Win32APIでウィンドウを中央に...
-
PeekMessageについて
-
CTreeCtrlのCreate関数でエラー...
-
オーバーレイみたいな処理がしたい
-
この列挙体でsysjanの関数はあ...
-
DirectInputについて再
おすすめ情報