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

标签 c# .net windows winapi

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

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

代码是 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 矩形底部 = 600 rect.top = 600

我完全不知道为什么会发生这种情况或如何纠正它,roclink800 是从 windows95 days 移植的旧程序,所以它可能使用了一些奇怪的 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 并且不返回表明句柄确实是正确句柄的假值。

所以看起来这个应用程序无法设置或通过 windowsAPI 获取其窗口大小,有人知道为什么会这样吗?

roclink.StartInfo.WindowStyle = ProcessWindowStyle.Maximized;

这也被忽略,应用程序将不会全屏打开,只是上次打开时的大小。

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

最佳答案

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

关于c# - GetWindowRect 在一个应用程序上返回错误值,所有其他应用程序都是正确的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10381631/

相关文章:

c# - 使用 SQL 存储过程和 C# 读取大量数据 (SQL Server 2005)

c# - XSLT 1.0 输出十六进制 0x1C - 0x1F 到文本文件

c# - 避免 Task 和 Task<T> 的重复方法

c# - 为什么没有 string.Split(string) 重载?

c# - asp.net 表单例份验证有哪些替代方案?

c# 使用 Linq 比较 List<T> (s)

.net - 使用 FitNesse 而不是 NUnit

windows - 以编程方式启用 Powershell 是否可以接受?

windows - 无法从 Centos vm ping 窗口 vm。我怎样才能解决这个问题?

windows - 如何在本地驱动器中搜索目录是否存在?