Qt4 で c++ を使用してスクリーン キャプチャ アプリケーションを作成しています。デュアル スクリーンでチューニングするときに問題が発生します。2 番目の画面で画像を取得できません。私は ac# アプリケーションを試してみました。これはすべてのデスクトップを 1 つのイメージで取得し、そこから各画面のデスクトップ イメージを抽出できました。ここにc#コードがあります
using System;
using System.Drawing;
using System.Runtime.InteropServices;
public class TestGrab
{
[STAThread]
static void Main(string[] args)
{
IntPtr hDC = WindowsNative.GetDC(WindowsNative.GetDesktopWindow());
IntPtr hBitmap = WindowsNative.GetCurrentObject(hDC,
WindowsNative.OBJ_BITMAP);
System.Drawing.Bitmap imageDesktop = System.Drawing.Image.FromHbitmap(
hBitmap);
imageDesktop.Save(@"c:\zzzzdesktop.png");
}
}
public class WindowsNative
{
[DllImport("user32.dll")]
public static extern IntPtr GetDesktopWindow();
[DllImport("user32.dll")]
public static extern IntPtr GetDC(IntPtr ptr);
public const int OBJ_BITMAP = 7;
[DllImport("gdi32.dll")]
public static extern IntPtr GetCurrentObject(IntPtr hdc, uint
uiObjectType);
}
Qt コードは小さく、デスクトップへのネイティブ ウィンドウ ハンドルが Qt desktop0>winId() と異なるかどうかもテストしましたが、それらは同じです
QPixmap CaptureWinDesktop()
{
WId desktop=GetDesktopWindow();
WId desktop2=QApplication::desktop()->winId();
if(desktop!=desktop2)
{
qDebug("sunt fdiferite WId");
}
QPixmap entireDesktop= QPixmap::grabWindow(desktop);
return entireDesktop;
}
これが Qt のバグなのか機能なのかはわかりません。同じウィンドウ ハンドルを使用すると、実際にはデスクトップが 2 つの画面からリレー構成されているときに、最初のデスクトップのみが再試行されます。1 つのアイデアは、ネイティブの Windows 呼び出しを使用して一時ファイルに画像を保存し、そこから QPixmap をロードすることですが、MFC を使用せずに C++ のファイルに HBITMAP を保存するのは簡単ではありません。結論: Qt のバグは何だと思いますか? それを回避する方法(MFCなし)