- ベストアンサー
コンソールアプリケーションでのWIN32 APIメッセージ処理
- VisualStdio.NET 2005のC++で作成しているコンソールアプリケーションで、PostMessageでメッセージを送信しているのに、PeekMessageで検出できません。
- ウィンドウハンドルの確認部分はパスしますが、PostMessageとPeekMessageの引数hWndをNULLに置き換えるとメッセージの検出はできるので、やはり、ウィンドウハンドルに問題があるのかもしれません。
- ウィンドウハンドルが不正です
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
ANo2のソースは勘違いでした。 FindWindowで0が返っています。 うまく行っていたように見えただけでした。 http://support.microsoft.com/kb/124103/jaの中に [FindWindowで]取得した HWND の値は、すべてのウィンドウハンドルを使用する処理において、適切なものであるとは保証されていません。 と書いてあります。 これが正しいのではないかと思います。
その他の回答 (2)
- Quant
- ベストアンサー率18% (23/122)
http://support.microsoft.com/kb/124103/jaの中に [FindWindowで]取得した HWND の値は、すべてのウィンドウハンドルを使用する処理において、適切なものであるとは保証されていません。 と書いてあります。 しかし下のプログラムではメッセージを取得するようです。 http://support.microsoft.com/kb/124103/jaの情報自体が古いのか、何か問題があるような気がします。 原因不明です。 #pragma comment(lib,"user32.lib") #include <windows.h> #include <stdio.h> void main( void ) { char OldTitle[1024], NewTitle[1024]; char WindowText[1024], ConsoleTitle[1024]; HWND hWnd; MSG Msg; HANDLE CONSOLE; /*** ウィンドウハンドルの取得 ***/ GetConsoleTitle( OldTitle, 1024 ); wsprintf( NewTitle, "%d/%d", GetTickCount(), GetCurrentProcessId()); SetConsoleTitle( NewTitle ); Sleep(40); //hWnd = FindWindow( NULL, NewTitle ); <-- ここが失敗している。 hWnd = FindWindow( NULL, OldTitle ); // SetConsoleTitle( OldTitle ); /*** ウィンドウハンドルの確認 ***/ /* GetWindowText( hWnd, WindowText, 1024 ); GetConsoleTitle( ConsoleTitle, 1024 ); if ( strcmp( WindowText, ConsoleTitle ) != 0 ){ printf( "ウィンドウハンドルが不正です" ); return; } */ /*** メッセージの送信と検出 ***/ PostMessage( hWnd,1050, 0, 0 ); do{ while ( PeekMessage( &Msg, hWnd, 0, 0, PM_REMOVE )){ printf( "メッセージを検出しました" ); getch(); return; } } while( 1 ); }
- osenbeyaketa
- ベストアンサー率75% (15/20)
FindWindowの第1引数にNULLが入ってますが、これが問題です。 クラス名を与えないといけません。 コンソールのクラス名が何なのか知りませんが、戻り値のウィンドウハンドルはNULL、つまり関数呼び出し失敗になっていませんか?
お礼
クラス名を指定してFindWindowを実行してもうまく動作しませんでした。 クラス名を指定してCreateWindowを実行して得たウィンドウハンドルでは動作しました。 ありがとうございました。
補足
回答ありがとうございます。 FindWindowの戻り値はNULLではなかったと思ったのですが、 再度確認すると、下記現象が確認できました。 ・パソコンの起動後、1回目のプログラム実行ではNULL ・パソコンの起動後、2回目以降のプログラム実行ではNULL以外 コンソールのクラス名を指定する方法で試してみようと思います。
お礼
そう考えるしかなさそうです。 ありがとうございました。