• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:コンソールアプリケーションでのWIN32 APIメッセージ処理)

コンソールアプリケーションでのWIN32 APIメッセージ処理

このQ&Aのポイント
  • VisualStdio.NET 2005のC++で作成しているコンソールアプリケーションで、PostMessageでメッセージを送信しているのに、PeekMessageで検出できません。
  • ウィンドウハンドルの確認部分はパスしますが、PostMessageとPeekMessageの引数hWndをNULLに置き換えるとメッセージの検出はできるので、やはり、ウィンドウハンドルに問題があるのかもしれません。
  • ウィンドウハンドルが不正です

質問者が選んだベストアンサー

  • ベストアンサー
  • Quant
  • ベストアンサー率18% (23/122)
回答No.3

ANo2のソースは勘違いでした。 FindWindowで0が返っています。 うまく行っていたように見えただけでした。 http://support.microsoft.com/kb/124103/jaの中に [FindWindowで]取得した HWND の値は、すべてのウィンドウハンドルを使用する処理において、適切なものであるとは保証されていません。 と書いてあります。 これが正しいのではないかと思います。

_hitoshi_
質問者

お礼

そう考えるしかなさそうです。 ありがとうございました。

その他の回答 (2)

  • Quant
  • ベストアンサー率18% (23/122)
回答No.2

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 ); }

回答No.1

FindWindowの第1引数にNULLが入ってますが、これが問題です。 クラス名を与えないといけません。 コンソールのクラス名が何なのか知りませんが、戻り値のウィンドウハンドルはNULL、つまり関数呼び出し失敗になっていませんか?

参考URL:
http://msdn.microsoft.com/ja-jp/library/cc364634.aspx
_hitoshi_
質問者

お礼

クラス名を指定してFindWindowを実行してもうまく動作しませんでした。 クラス名を指定してCreateWindowを実行して得たウィンドウハンドルでは動作しました。 ありがとうございました。

_hitoshi_
質問者

補足

回答ありがとうございます。 FindWindowの戻り値はNULLではなかったと思ったのですが、 再度確認すると、下記現象が確認できました。 ・パソコンの起動後、1回目のプログラム実行ではNULL ・パソコンの起動後、2回目以降のプログラム実行ではNULL以外 コンソールのクラス名を指定する方法で試してみようと思います。

関連するQ&A