3

Windows APIからGetWindowRectを使用して、実行中のアプリケーションの境界を取得し、これらの境界を使用してアプリケーションのスクリーンショットを作成します。

私のコードは、テストした約10個のプログラム、notepad.exeとその他のいくつかのプログラムで機能しますが、RocLink800で使用したい1つのアプリは、アプリケーションの場所に関係なく正しくない静的な値を返します。

コードはC#.NETです

    [StructLayout(LayoutKind.Sequential)]
    public struct RECT
    {
        public int X;
        public int Y;
        public int Width;
        public int Height;
    }

    [DllImport("user32.dll", SetLastError = true)]
    static extern bool GetWindowRect(IntPtr hWnd, ref RECT Rect);

    IntPtr error = GetWindowRect(proc.MainWindowHandle, ref rect);

    ... main code
    while (error == (IntPtr)0)
    {
        error = GetWindowRect(proc.MainWindowHandle, ref rect);
    }

    int width = rect.right - rect.left;
    int height = rect.bottom - rect.top;

これで、すべてのアプリケーションが正しい幅と高さを返します。roclink800では、成功を示すエラー値1が返されますが、アプリケーションの場所に関係なく、次の値が返されます。

rect.right = 960 rect.left = 960 rect.bottom = 600 rect.top = 600

私はこれが起こっている理由やそれを修正する方法に完全に困惑しています、roclink800はwindows95日から移植された古いプログラムなので、おそらくそれはいくつかの奇妙なAPIを使用しています、これが事実である場合、windows API(user32.dll )その画面座標を取得するには?

アプリケーションを強制的にフルスクリーンにして、この方法でスクリーンキャプチャすることもできますが、エレガントさは劣ります。

アイデアは誰ですか?

編集:ハンドルを取得するための私のコード

        Process roclink = new Process();
        roclink.StartInfo.FileName = "C:/Program Files (x86)/ROCLINK800/Roclink.exe";
        //roclink.StartInfo.FileName = "notepad.exe";
        roclink.Start();
        IntPtr error = GetWindowRect(roclink.MainWindowHandle, ref rect);

また

        try
        {
            proc = Process.GetProcessesByName("roclink")[0];
        }
        catch (IndexOutOfRangeException e)
        {
            return null;
        }

コードの両方のチャンクは同じIntPtrを返し、両方とも960,960,600,600を返しますが、

int error = SetWindowPos(roclink.MainWindowHandle, HWND_TOPMOST, 0, 0, 25,50, SWP_SHOWWINDOW);

次に、返される座標は0,0,25,50になりますが、アプリケーションのサイズは変わりません。

プログラムを壊してroclinkを閉じようとしましたが、SetWindowPosとGetWindowRectはどちらも0を返し、ハンドルが実際に正しいハンドルであることを示すfalse値を返しません。

したがって、このアプリケーションはウィンドウサイズを設定したり、windowsAPIを介して取得したりすることはできないようですが、なぜそうなるのか、誰かが手がかりを得たのでしょうか。

roclink.StartInfo.WindowStyle = ProcessWindowStyle.Maximized;

これも無視され、アプリケーションはフルスクリーンで開きません。単に最後に開いたサイズです。

編集:私が思いつくことができる唯一の解決策は、roclink.exeのコピーを作成し、手動でフルスクリーンで開いてから閉じることです。他の誰もこのファイルを開かない限り、常にフルスクリーンで開きます。これは危険です。それは好きではありませんが、誰かが何か考えを持っていない限り、なぜこれが当てはまるのか、私はこれを使わなければならないかもしれません。:(

4

2 に答える 2

5

MainWindowHandleあなたのアプリケーションの場合、アプリケーションが起動する実際の「メインウィンドウ」ではないことは明らかだと思います。

于 2012-04-30T09:54:41.397 に答える
4

この RockLink800 アプリケーションのスクリーンショットを見ると、これは Delphi アプリケーションのように見えます。Delphi の古いバージョンには、Application.Handle という非表示のウィンドウがありました。

これは、古い Delphi アプリケーションのメイン ウィンドウ ハンドルを取得する方法に関する SO の回答です。

Delphi ウィンドウ ハンドルの取得

于 2012-04-30T10:22:01.773 に答える