プロが教えるわが家の防犯対策術!

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

VisualStdio.NET 2005のC++で作成しているコンソールアプリケーションで、
PostMessageでメッセージを送信しているのに、PeekMessageで検出できません。
下のプログラムに誤った点があるのでしょうか?

尚、ウィンドウハンドルの確認部分はパスしますが、
PostMessageとPeekMessageの引数hWndをNULLに置き換えるとメッセージの検出はできるので、
やはり、ウィンドウハンドルに問題があるのかもしれません。


#include <windows.h>
#include <stdio.h>

void main( void )
{
  char OldTitle[1024], NewTitle[1024];
  char WindowText[1024], ConsoleTitle[1024];
  HWND hWnd;
  MSG Msg;

  /*** ウィンドウハンドルの取得 ***/

  GetConsoleTitle( OldTitle, 1024 );
  wsprintf( NewTitle, "%d/%d", GetTickCount(), GetCurrentProcessId());
  SetConsoleTitle( NewTitle );
  Sleep(40);
  hWnd = FindWindow( NULL, NewTitle );
  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( "メッセージを検出しました" );
      return;
    }
  } while( 1 );
}

A 回答 (3件)

ANo2のソースは勘違いでした。


FindWindowで0が返っています。
うまく行っていたように見えただけでした。

http://support.microsoft.com/kb/124103/jaの中に

[FindWindowで]取得した HWND の値は、すべてのウィンドウハンドルを使用する処理において、適切なものであるとは保証されていません。

と書いてあります。

これが正しいのではないかと思います。
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/10/18 13:18

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 );
}
    • good
    • 0

FindWindowの第1引数にNULLが入ってますが、これが問題です。


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

参考URL:http://msdn.microsoft.com/ja-jp/library/cc364634 …

この回答への補足

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

コンソールのクラス名を指定する方法で試してみようと思います。

補足日時:2010/10/18 11:51
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/10/18 13:17

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!