【SendMessage】関数【PostMessage】関数についてご教授下さい。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
damedamekun

【SendMessage】関数【PostMessage】関数についてご教授下さい。

#1

投稿記事 by damedamekun » 9年前

【SendMessage】関数【PostMessage】関数についてご教授下さい。

開発中のシステムからメモ帳のウィンドウハンドル(入力ウィンドウ)を取得し、
SendMessageやPostMessageを行っています。

PostMessageは成功するのですが、SendMessageが失敗してしまます。

なぜ、SendMessageが失敗するのか、原因をご教授下さい。

コードは以下の通りです。

コード:

HWND  wh = FindWindow(nullptr, p);//pは”無題 - メモ帳”です 本体のウィンドウハンドルを取得
wh = GetWindow(wh,5);//入力欄のウィンドウハンドルを取得

	SendMessage(wh, WM_KEYDOWN, 'A', 0);
	PostMessage(wh, WM_KEYDOWN, 'B', 0);


このコードを実行すると b のみ出力され a が出力されません。
なぜでしょうか?環境面など悪さしてますか?それともコーディング間違いでしょうか?

同期処理を実現したいのでSendMessageが使いたいのです。

環境は以下です。
--------------
Windows7
Visual Studio
C++ cli
--------------

can110
記事: 27
登録日時: 10年前

Re: 【SendMessage】関数【PostMessage】関数についてご教授下さい。

#2

投稿記事 by can110 » 9年前

VS2015以下コードにて動作しました。
エディットコントロールに対して送信するようにしています。

コード:

	HWND hWnd = ::FindWindow( _T("Notepad"), NULL );
	if( !hWnd) return;
	HWND hEdit = ::FindWindowEx( hWnd, NULL, _T("Edit"), NULL );
	if( !hEdit) return;

	::SendMessage( hEdit, WM_CHAR, _T('a'), 0 );
	::SendMessage( hEdit, WM_CHAR, _T('b'), 0 );
	::SendMessage( hEdit, WM_CHAR, VK_RETURN, 0);
	::SendMessage( hEdit, WM_CHAR, _T('c'), 0 );
	::SendMessage( hEdit, WM_CHAR, _T('d'), 0 );

damedamekun

Re: 【SendMessage】関数【PostMessage】関数についてご教授下さい。

#3

投稿記事 by damedamekun » 9年前

ありがとうございます。
SendMessage(wh, WM_CHAR, 'A', 0);
で出来ました。

つまり、SendMessage でWM_KEYDOWN は使えないということですね?

次のステップなのですが、
「ctrl+Sを押す」といった事は、
SendMessageで行えますか?PostMessageを使うしかないでしょうか?

コード例以下です。
「ctrl+Sを押す」

コード:

SendMessage(wh , WM_KEYDOWN , VK_CONTROL , 0);
SendMessage(wh , WM_KEYDOWN , 'S' , 0);
SendMessage(wh, WM_KEYUP, VK_CONTROL, 0);
SendMessage(wh, WM_KEYUP, 'S', 0);

can110
記事: 27
登録日時: 10年前

Re: 【SendMessage】関数【PostMessage】関数についてご教授下さい。

#4

投稿記事 by can110 » 9年前

つまり、SendMessage でWM_KEYDOWN は使えないということですね?
使えないというわけではありません。
送信したメッセージは受信側ウインドウが処理をしますが
ウインドウの種類やタイミングなどにより適切なメッセージを送信しないといけません。
任意のウインドウのメッセージを取得する「SPY++」というツールがVisual Studioに付属しています。
このツールでメモ帳を操作したときどのようなメッセージが送受信されているか確認することができます。
「ctrl+Sを押す」といった事は、
おそらくやりたいことは「名前を付けて保存」だと思いますが、以下のコードで保存ダイアログを表示することができます。

コード:

	// 名前を付けて保存
	::SendMessage( hWnd, WM_COMMAND, 0x03, 0);
最終目的は不明ですが、メモ帳を外部から操作しファイルを保存するのは手間がかかると思います。

閉鎖

“C言語何でも質問掲示板” へ戻る