Teamviewer打破了GetWindowRect

时间:2013-11-12 09:46:10

标签: c# user32

我正在尝试按进程名称抓取一个窗口并将其关注,然后截取它的截图。除非我打开Teamviewer(即使在使用teamviewer进行屏幕共享时,只是在团队查看器运行时),它的工作方式也很完美。

当teamviewer正在运行时,窗口没有聚焦或被带到前台,而截图的矩形非常小(33x21),通常它是1600x900。

以下是相关代码:

        proc = Process.GetProcessesByName(procName)[0];
        SetForegroundWindow(proc.MainWindowHandle);
        ShowWindow(proc.MainWindowHandle, SW_RESTORE);

        Rect rect = new Rect();
        GetWindowRect(proc.MainWindowHandle, ref rect);

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

        Bitmap bmp = new Bitmap(width, height, PixelFormat.Format32bppArgb);
        Graphics.FromImage(bmp).CopyFromScreen(rect.left, rect.top, 0, 0, new Size(width, height), CopyPixelOperation.SourceCopy);

以下是我获得这些功能的地方:

    [DllImport("user32.dll")]
    private static extern IntPtr ShowWindow(IntPtr hWnd, int nCmdShow);

    [DllImport("user32.dll")]
    public static extern IntPtr GetWindowRect(IntPtr hWnd, ref Rect rect);

    [DllImport("user32.dll")]
    private static extern int SetForegroundWindow(IntPtr hWnd);

2 个答案:

答案 0 :(得分:1)

我遇到过类似的问题。在两台Windows 7 Pro计算机上,我注意到在TeamViewer客户端运行时,以下代码停止工作。

var wordProcess = Process.GetProcessesByName("winword")
    .FirstOrDefault(process => process.MainWindowTitle.Contains(documentName));

设置断点并检查单个正在运行的WINWORD进程会发现Process.MainWindowTitle属性在大多数情况下都是空白的。而WinWord Windows任务栏图标清晰显示标题。

退出TeamViewer会使事情恢复正常:每次正确填充Process.MainWindowTitle。

我已将此问题报告给TeamViewer团队。


经测试: TeamViewer 9 ver。 9.0.27339,设置为无人值守访问; MS Word 2007

答案 1 :(得分:1)

我也发现teamViewer打破了UI自动化。禁用"呈现此应用程序"函数重新启用UI自动化。