0

メソッドを使用してGraphics.CopyFromScreen()、HWND を持っているコントロールのスナップショットをキャプチャしています。問題は、点滅するキャレットをキャプチャしたくないということです。これを達成する方法はありますか?API 呼び出し ( BitBlt?) が必要な場合は、それを使用することにオープンです。

注:ここで非常によく似た質問を見たことがありますが、問題は、私のコントロールが WinForms コントロールではなく、標準の EDIT クラスでさえないため、DrawToBitmap(). セル内でF2を押すと表示されるExcelの編集ボックスです。

4

1 に答える 1

1

HideCaret および ShowCaret 関数が役立つようです

http://msdn.microsoft.com/en-us/library/windows/desktop/ms648406(v=vs.85).aspx http://msdn.microsoft.com/en-us/library/windows/desktop/ ms648403(v=vs.85).aspx

キャレットを保持するコントロール (Edit、ComobBox など) のハンドルを取得するには、関数 GetWindowThreadProcessId を使用して ThreadId GetGUIThreadInfo を取得し、キャレット ホルダーのハンドルを取得します。

http://msdn.microsoft.com/en-us/library/windows/desktop/ms633522(v=vs.85).aspx

[DllImport("User32",
           CallingConvention = CallingConvention.Winapi,
           ExactSpelling = true,
           EntryPoint = "HideCaret",
           SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern Boolean HideCaret(IntPtr hWnd);

[DllImport("User32",
           CallingConvention = CallingConvention.Winapi,
           ExactSpelling = true,
           EntryPoint = "ShowCaret",
           SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern Boolean ShowCaret(IntPtr hWnd);


// If the window you have to copy is in your process then 
// handle = IntPtr.Zero
// Otherwise your have to find it out via GetWindowThreadProcessId and GetGUIThreadInfo 

HideCaret(handle);

try {
  // Your code to capture the image 
}
finally {
  ShowCaret(handle);
}
于 2013-04-28T11:28:02.953 に答える