SendMessage WM_GETTEXTで動作が停止してしまう

解決


Fusa  URL  2008-01-31 20:05:27  No: 29592

こんにちは。
質問します。

プログラム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した時に戻りが非常に遅い場合、
どのように対処すればよいのでしょうか?

ご存じの方、おられましたら
よろしくお願いします。

※前のゴーストウィンドウに関する質問とも
  関連しています。


Fusa  2008-01-31 20:14:00  No: 29593

追記です。

SendMessage WM_GETTEXT する前に
そのウィンドウが停止していることを知ることができたら
その方法も知りたいです。

現状では停止しているかどうかがわからないので
プログラムAも巻き込んで停止してしまい困っています。

停止していないウィンドウに対してのみタイトルバー文字を
得られる処理がしたいと思っています。


おに  2008-01-31 21:02:29  No: 29594

SendMessageTimeout つーAPIがあるのでこれをつかったら上手く処理出来る気がします。


Fusa  2008-01-31 21:55:57  No: 29595

さっそくやってみました。

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加