コンソールアプリケーションでの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 );
}
No.3ベストアンサー
- 回答日時:
ANo2のソースは勘違いでした。
FindWindowで0が返っています。
うまく行っていたように見えただけでした。
http://support.microsoft.com/kb/124103/jaの中に
[FindWindowで]取得した HWND の値は、すべてのウィンドウハンドルを使用する処理において、適切なものであるとは保証されていません。
と書いてあります。
これが正しいのではないかと思います。
No.2
- 回答日時:
[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 …
この回答への補足
回答ありがとうございます。
FindWindowの戻り値はNULLではなかったと思ったのですが、
再度確認すると、下記現象が確認できました。
・パソコンの起動後、1回目のプログラム実行ではNULL
・パソコンの起動後、2回目以降のプログラム実行ではNULL以外
コンソールのクラス名を指定する方法で試してみようと思います。
クラス名を指定してFindWindowを実行してもうまく動作しませんでした。
クラス名を指定してCreateWindowを実行して得たウィンドウハンドルでは動作しました。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Vba LongPtrについて教えてください 2 2022/08/19 11:14
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教える店舗&オフィスのセキュリティ対策術
中・小規模の店舗やオフィスのセキュリティセキュリティ対策について、プロにどう対策すべきか 何を注意すべきかを教えていただきました!
-
プロセスIDからウィンドウハンドルを取得する方法
C言語・C++・C#
-
画面を強制的に再描画させる方法
C言語・C++・C#
-
Console Applicationをタスクトレイに常駐できますか?
C言語・C++・C#
-
-
4
C++でUSBメモリが接続されたことを認識したい
C言語・C++・C#
-
5
C#で自分のウインド・ハンドルを取得するにはどうすればよいのでしょうか
C言語・C++・C#
-
6
ビジュアルC++でボタンの有効/無効
C言語・C++・C#
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで作った新しいウイン...
-
「アイテムは収集されました」...
-
検索の画面がでなくなってしま...
-
作成したウインドウのサイズを...
-
アクティブウインドウのIME...
-
ゲームでは結局どっちが良いの?
-
VBで外部プログラムを位置のみ...
-
勝手にウィンドウが開いて止ま...
-
ラジオボタンの初期指定
-
メッセージをスルー
-
Excelの上下を固定したい
-
c++/cli .NET Formアプリケー...
-
OutlookでRSSフィードやメモの...
-
【VB2008】 マウス操作の一時的...
-
パソコン関連)何度消してもま...
-
子ウィンドウに発生したイベント
-
Vba LongPtrについて教えてくだ...
-
他のアプリケーションの終了処理
-
[VBA] UserForm を Excel の W...
-
Alt+P,Alt+NをPostmessageで送...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで作った新しいウイン...
-
「アイテムは収集されました」...
-
検索の画面がでなくなってしま...
-
勝手にウィンドウが開いて止ま...
-
ゲームでは結局どっちが良いの?
-
ラジオボタンの初期指定
-
VBA .Value=.Value ?
-
Excelの上下を固定したい
-
ExcelのBOOKが消えた!
-
他のアプリケーションの終了処理
-
Vba LongPtrについて教えてくだ...
-
作成したウインドウのサイズを...
-
UWSCで特定のChromeのタブをア...
-
[VBA] UserForm を Excel の W...
-
MFC ダイアログ上のID取得につ...
-
Alt+P,Alt+NをPostmessageで送...
-
「&HFFFF」「&H1A」とは?
-
ExcelVBAでAPIを使って外部ウイ...
-
親ウインドウにあるOKボタンを...
-
EnumChildWindowsの使い方(VBA)
おすすめ情報