こんにちは。
質問します。
プログラムAで
プログラムBに対して
var
WindowText: array [0..255] of Char;
SendMessage(プログラムBのハンドル,
WM_GETTEXT, 255, Integer(@WindowText));
とすると、普通はそのアプリのウィンドウテキスト
つまり、タイトルバーの文字が取得できるのですが
WindowsXPでプログラムBのボタンイベントで
Sleep(1000*60);
と記述すると、そこで動作が停止してしまい
プログラムAも戻りが無い為に停止してしまいます。
他のOS上では動作は確認してません。
かといって、SendMessageをPostMessageにしても
タイトルバー文字は得られませんし
このようにSendMessageした時に戻りが非常に遅い場合、
どのように対処すればよいのでしょうか?
ご存じの方、おられましたら
よろしくお願いします。
※前のゴーストウィンドウに関する質問とも
関連しています。
追記です。
SendMessage WM_GETTEXT する前に
そのウィンドウが停止していることを知ることができたら
その方法も知りたいです。
現状では停止しているかどうかがわからないので
プログラムAも巻き込んで停止してしまい困っています。
停止していないウィンドウに対してのみタイトルバー文字を
得られる処理がしたいと思っています。
SendMessageTimeout つーAPIがあるのでこれをつかったら上手く処理出来る気がします。
さっそくやってみました。
var
WindowText: array [0..255] of Char;
APIResult: DWORD;
begin
//SendMessage(FHandle, WM_GETTEXT, 255, Integer(@WindowText));
if 0 <> SendMessageTimeout(FHandle, WM_GETTEXT, 255, Integer(@Windowtext),
SMTO_ABORTIFHUNG, 1000, APIResult) then
begin
Result := WindowText;
end else
begin
Result := '(応答なし)';
end;
end;
フラグが適切かどうかが微妙にわかりませんが
ハングを無視する設定だからいいのかな。
ハングしているウィンドウは応答なしという文字を
返すような作りにしています。
ありがとうございました。
下記も参考にしました。
SendMessageTimeout
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpwinui/html/_win32_sendmessagetimeout.asp
ツイート | ![]() |