2012-12-27 14 views
5

私がやろうとしているのは、同じプロセスでコントロールを持たないコントロールを自分自身を再描画することです()。再描画を完了しました再描画ウィンドウコントロール(ブロックメソッドを使用)

UpdateWindowを使ってみましたが、再描画が完了するのを待っているようです。

私がそれを描くのを待つ必要がある理由は、後で画面をつかみたいということです。

コントロールはdotNetコントロールではなく、通常のウィンドウコントロールです。

私がいることが確認されました:

  • ハンドルが正しいです。
  • UpdateWindowがtrueを返します。
  • UpdateWindowを呼び出す直前にInvalidateRect(hWnd, IntPtr.Zero, true)を送信して、ウィンドウを無効にする必要があるかどうかを確認してください。
  • コントロールの親ウィンドウで同じことを試してみました。

コードを使用:

[DllImport("user32.dll")] 
[return: MarshalAs(UnmanagedType.Bool)] 
private static extern bool InvalidateRect(IntPtr hWnd, IntPtr rect, bool bErase); 

[DllImport("user32.dll")] 
[return: MarshalAs(UnmanagedType.Bool)] 
private static extern bool UpdateWindow(IntPtr hWnd); 

public bool PaintWindow(IntPtr hWnd) 
{ 
    InvalidateRect(hWnd, IntPtr.Zero, true); 
    return UpdateWindow(hWnd); 
} 
//returns true 
+0

。 –

+0

@ S.A.Parkhidお願いします。 – Rotem

+0

Hmm ..なぜ、_UpdateWindowが再描画が完了するのを待っていないと思われますか? –

答えて

1

をあなたは(WM_PAINTを含む!)すべてエンキューされたメッセージApplication.DoEventsを使用して処理するアプリケーションを強制することができます。このような何か:

public bool PaintWindow(IntPtr hWnd) 
{ 
    InvalidateRect(hWnd, IntPtr.Zero, true); 
    if (UpdateWindow(hWnd)) 
    { 
     Application.DoEvents(); 
     return true; 
    } 

    return false; 
} 

しかし、あなたは、とにかく画面をつかむつもりなら、それはより良いWM_PRINTメッセージを送信することにより、一石2羽の鳥を殺すためではないでしょうか?

次のコードでそれを行うことができます。たぶん、あなたはWM_PAINTケースでレンダリングを無効にすることができますし、その後のことを再度有効

internal static class NativeWinAPI 
{ 
    [Flags] 
    internal enum DrawingOptions 
    { 
     PRF_CHECKVISIBLE = 0x01, 
     PRF_NONCLIENT = 0x02, 
     PRF_CLIENT = 0x04, 
     PRF_ERASEBKGND = 0x08, 
     PRF_CHILDREN = 0x10, 
     PRF_OWNED = 0x20 
    } 

    internal const int WM_PRINT = 0x0317; 

    [DllImport("user32.dll", CharSet = CharSet.Auto)] 
    internal static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, 
     IntPtr wParam, IntPtr lParam); 
} 

public static void TakeScreenshot(IntPtr hwnd, Graphics g) 
{ 
    IntPtr hdc = IntPtr.Zero; 
    try 
    { 
     hdc = g.GetHdc(); 

     NativeWinAPI.SendMessage(hwnd, NativeWinAPI.WM_PRINT, hdc, 
      new IntPtr((int)(
       NativeWinAPI.DrawingOptions.PRF_CHILDREN | 
       NativeWinAPI.DrawingOptions.PRF_CLIENT | 
       NativeWinAPI.DrawingOptions.PRF_NONCLIENT | 
       NativeWinAPI.DrawingOptions.PRF_OWNED 
       )) 
      ); 
    } 
    finally 
    { 
     if (hdc != IntPtr.Zero) 
      g.ReleaseHdc(hdc); 
    } 
} 
+0

ありがとう、私はこれを試してみてお知らせします。 – Rotem

+0

@Rotem、あなたはあなたの問題を解決しましたか? –

+0

明日はそれをテストすることができます、私はすぐに更新します。 – Rotem

関連する問題