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のコピーを作成し、手動でフルスクリーンで開いてから閉じることです。他の誰もこのファイルを開かない限り、常にフルスクリーンで開きます。これは危険です。それは好きではありませんが、誰かが何か考えを持っていない限り、なぜこれが当てはまるのか、私はこれを使わなければならないかもしれません。:(