C# GetWindowRect在一个应用程序上返回错误的值,所有其他应用程序都是正确的

C# GetWindowRect在一个应用程序上返回错误的值,所有其他应用程序都是正确的,c#,.net,windows,winapi,C#,.net,Windows,Winapi,我使用windows API中的GetWindowRect来获取正在运行的应用程序的边界,然后使用这些边界截图应用程序 我的代码适用于我测试过的大约10个程序,notepad.exe和其他一些程序,但是我想将其与RocLink800一起使用的一个应用程序返回的静态值不正确,无论应用程序位于何处 代码是C#.NET 现在,所有应用程序返回正确的宽度和高度,使用roclink800,它返回一个错误值1,表示成功,但无论应用程序位置如何,它都返回以下值: rect.right=960 rect.lef

我使用windows API中的GetWindowRect来获取正在运行的应用程序的边界,然后使用这些边界截图应用程序

我的代码适用于我测试过的大约10个程序,notepad.exe和其他一些程序,但是我想将其与RocLink800一起使用的一个应用程序返回的静态值不正确,无论应用程序位于何处

代码是C#.NET

现在,所有应用程序返回正确的宽度和高度,使用roclink800,它返回一个错误值1,表示成功,但无论应用程序位置如何,它都返回以下值:

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

我完全不明白为什么会发生这种情况,或者如何纠正它,roclink800是一个从windows95天移植过来的旧程序,所以可能它使用了一些奇怪的api,如果是这样的话,从WindowsAPI(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);

这两段代码都返回相同的IntPtr,如果我调用

int error = SetWindowPos(roclink.MainWindowHandle, HWND_TOPMOST, 0, 0, 25,50, SWP_SHOWWINDOW);
然后我得到返回的坐标为0,0,25,50,但应用程序大小不变

我尝试过中断程序,关闭roclink,SetWindowPos和GetWindowRect都返回0,并且不返回表示句柄确实是正确句柄的假值

所以这个应用程序似乎不能设置WindowsSize或通过windowsAPI获取,有人知道为什么会这样吗

roclink.StartInfo.WindowStyle = ProcessWindowStyle.Maximized;
这也被忽略,应用程序将不会全屏打开,只是上次打开时的大小


编辑:我能想到的唯一解决方案是制作一份roclink.exe的副本,手动全屏打开它,然后关闭它,如果没有其他人打开此文件,它将始终全屏打开,这是不可靠的,我不喜欢它,但除非有人知道为什么会这样,否则我可能不得不这样做:(

我认为很明显,在您的应用程序中,
MainWindowHandle
不是应用程序启动的实际“主窗口”。

查看此RockLink800应用程序的屏幕截图,这似乎是一个Delphi应用程序,而旧版本的Delphi有一个隐藏窗口,即application.Handle

下面是如何为旧的Delphi应用程序获取主窗口句柄的答案:


哇,这真的很简单,出于某种原因,我在通过“roclink”获取句柄时得到了一个非零值,这让我觉得它成功地获取了句柄,如果我在其中放入gibberish,它将返回一个空值,但不返回“roclink”,真奇怪,我通过一个进程启动了应用程序,并使用了process.MainWindowHandle,现在它成功运行了。谢谢!好了,现在它随机工作,不是吗?它交替给出正确的坐标,然后再次给出960960600600。有人知道为什么我的句柄会给出正确的坐标1/10次,然后是这些garba吗如果我发送SetWindowPos(roclink.MainWindowHandle,HWND_TOPMOST,0,0,25,50,SWP_SHOWWINDOW),那就更奇怪了;然后它返回0,0,25,50的坐标,但应用程序实际上并没有改变它的坐标。也许这说明它是错误的句柄,也许更好的问题是它为什么返回错误的句柄?我将用句柄获取代码更新我的问题。我建议的是.MainWindowHandle pproperty不是您试图获取的实际窗口。请使用SPY++将您正在检查的句柄与窗口的实际句柄进行比较。如果您正确,它是表单中某个属性的句柄,我将如何通过编程方式获取此正确句柄?谢谢,这解释了为什么我在查找窗口时遇到困难dle,我用Rotems的建议找到了正确的手柄。
int error = SetWindowPos(roclink.MainWindowHandle, HWND_TOPMOST, 0, 0, 25,50, SWP_SHOWWINDOW);
roclink.StartInfo.WindowStyle = ProcessWindowStyle.Maximized;