C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: 対象ウィンドウの再描画完了を検知する方法


(過去ログ 84 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■50189 / inTopicNo.1)  対象ウィンドウの再描画完了を検知する方法
  
□投稿者/ こあら (81回)-(2010/05/30(Sun) 15:47:32)

分類:[Delphi] 

Delphi5
Windows2000

対象ウィンドウの再描画完了を検知する方法を教えて下さい。

画面のキャプチャツールを作成しています。
指定した文字列でEnumWindowsのウィンドウテキストをあいまい検索して、
キャプチャしたいウィンドウをアクティブにしてからBitBltしていますが、
タイミングによって、再描画が完了する前の画面をキャプチャしてしまいます。

対象ウィンドウをアクティブにするコードです。
*---
var
  h:HWND; //キャプチャ対象ウィンドウハンドル
begin
    h := FindWindow(nil, PChar('電卓'));

    if IsIconic(h) then
    begin
      SendMessage(h, WM_SYSCOMMAND, WPARAM(SC_レストア and $FFF0), 0);
    end else begin
      SetForegroundWindow(h);
    end;

    Application.ProcessMessages;
    WaitForInputIdle(h, INFINITE); //効果がないっぽい
    Sleep(1000);                   //苦肉のSleep
end;
---*

今は苦肉の回避策でSleepしていますが、確実な方法がありそうな気もしています。
よろしくお願い致します。

引用返信 編集キー/
■50190 / inTopicNo.2)  Re[1]: 対象ウィンドウの再描画完了を検知する方法
□投稿者/ 渋木宏明(ひどり) (1344回)-(2010/05/30(Sun) 17:00:22)
渋木宏明(ひどり) さんの Web サイト
> 対象ウィンドウの再描画完了を検知する方法を教えて下さい。

何を持ってして「再描画完了」とするか、明確な基準が設定出来ないですね。

何かしらアニメーションのような表示を行うようなアプリでは、常時再描画してるわけで。

↑のシナリオだと、比較的キリが良さそうなのは、WaitForInputIdle() による待ち合わせとか?

引用返信 編集キー/
■50261 / inTopicNo.3)  Re[2]: 対象ウィンドウの再描画完了を検知する方法
□投稿者/ こあら (82回)-(2010/06/01(Tue) 21:10:39)
No50190 (渋木宏明(ひどり) さん) に返信
>>対象ウィンドウの再描画完了を検知する方法を教えて下さい。
> 比較的キリが良さそうなのは、WaitForInputIdle() による待ち合わせとか?

末端ウィンドウをWaitForInputIdleすることで対処できたっぽいです。
これで暫く様子見したいと思います。ありがとうございました。

  procedure WaitForInputIdleR(p: HWND);
  var
    c: HWND;
  begin
    c := GetWindow(p, GW_CHILD);
    if c = 0 then
    begin
      Application.ProcessMessages;
      WaitForInputIdle(p, INFINITE);
    end;

    while c <> 0 do
    begin
      WaitForInputIdleR(c);
      c := GetWindow(c, GW_HWNDNEXT);
    end;
  end;

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -