Windows XP で別のアプリケーション ウィンドウの画像を取得しようとしています。
DWMRegisterThumbnail API のおかげで Windows 7 でこれを行うことができ、問題なく動作します。ただし、Windows XP には DWM API がないため、PrintWindow に依存しています。
このアプリケーションは、「メニュー」ごとに (UI のボタンを押すたびに) 新しいウィンドウを開くため、すべてのウィンドウを再列挙して最新のものを見つける必要があります (実際、FindWindow はとにかく最新のものを返します)。ただし、アプリケーションが古いウィンドウの 1 つへのハンドルをまだ持っているために、いくつかの時点でクラッシュしますか?
これは私の現在のコードです:
if (garminHwnd == IntPtr.Zero)
return;
garminHwnd = FindWindow("CDP_FIELD_WND", String.Empty);
IntPtr hdc = GetWindowDC(garminHwnd);
if (hdc != IntPtr.Zero)
{
Graphics memoryGraphics = Graphics.FromImage(bmp);
IntPtr dc = memoryGraphics.GetHdc();
bool success = PrintWindow(garminHwnd, dc, 0);
memoryGraphics.ReleaseHdc(dc);
}
「bmp」はビットマップで、現時点では PictureBox に表示されているだけです。これは約 1/秒で実行されます。
私がやっていることをより魅力的/簡単に行う方法はありますか?