SetWindowPos不适用于浏览器

我一直试图在C#中创建一个简单的程序,以启动不同的软件,并将其移动到特定的屏幕上,以便能够在总共有12个监视器的计算机上自动设置不同的窗口。

大多数这些窗口都是在Chrome或Internet Explorer中启动的。

我用来移动appplications的代码如下:[DllImport(“User32.dll”)] static extern int SetForegroundWindow(IntPtr hWnd);

[DllImport("user32.dll", EntryPoint = "SetWindowPos")]
public static extern IntPtr SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int x, int Y, int cx, int cy, int wFlags);

this.process = Process.Start(this.startInfo);
process.WaitForInputIdle();
SetForegroundWindow(this.process.MainWindowHandle);

Console.WriteLine("Process ID: "+ this.process.Handle);
this.process.Refresh();
Console.WriteLine("Main window handle: " + this.process.MainWindowHandle);

Point screenlocation = Screen.AllScreens[MonitorNum].Bounds.Location;
SetWindowPos(this.process.MainWindowHandle, -1, screenlocation.X, screenlocation.Y, Screen.AllScreens[MonitorNum].Bounds.Width, Screen.AllScreens[MonitorNum].Bounds.Height, 1);

它似乎与记事本一起工作得很好,但是当它是浏览器时,MainWindowHandle总是返回IntPtr.Zero,即使我刷新了过程。

有什么建议?


现代浏览器使用复杂的多进程体系结构。

如果在启动新的chrome.exe进程时chrome进程已经在运行,那么在两个进程之间会发生一些进程间通信,并启动一个新的子进程(旧的预先存在的进程的子进程)来承载新的选项卡呈现。 您启动的过程会立即退出,并且您无法为现在已死的进程获取主窗口。 新的Chrome主窗口的创建是先前存在的过程。

您可以尝试使用以下C ++源代码

#include <Windows.h>
#include <stdio.h>

int main( void ) {

    STARTUPINFO SI;
    memset( &SI, 0, sizeof SI );
    SI.cb = sizeof SI;

    PROCESS_INFORMATION PI;

    BOOL bWin32Success =
    CreateProcess( L"C:UsersmanuelAppDataLocalGoogleChromeApplicationchrome.exe",
                   NULL, NULL, NULL, FALSE, 0, NULL,
                   L"C:UsersmanuelAppDataLocalGoogleChromeApplication",
                   &SI, &PI );
    if ( bWin32Success ) {
        printf( "PID %un", PI.dwProcessId );
        DWORD dwRet = WaitForInputIdle( PI.hProcess, 1000 );
        switch ( dwRet ) {
            case 0:
                printf( "WaitForInputIdle succeedeedn" );
                break;
            case WAIT_TIMEOUT:
                printf( "WaitForInputIdle timed outn" );
                break;
            case WAIT_FAILED:
                printf( "WaitForInputIdle Error %un", GetLastError() );
                break;
            default:
                printf( "WaitForInputIdle Unknown return value %dn", dwRet );
        }
        CloseHandle( PI.hThread );
        CloseHandle( PI.hProcess );

    } else {
        printf( "CreateProcess Error %un", GetLastError() );
    }
    return 0;
}

使用Spy ++和Windows任务管理器,或者更好的Process Explorer,你会看到,当chrome已经运行时,新的Chrome主窗口由已经运行的chrome.exe托管,并且由CreateProcess启动的进程终止。

解:

  • 使用一些窗口枚举API拍摄当前显示的Chrome主窗口的快照
  • 开始一个新的chrome.exe
  • 拍摄新快照。 新窗口是第一个快照中不存在的窗口。
  • 链接地址: http://www.djcxy.com/p/38843.html

    上一篇: SetWindowPos not working for browsers

    下一篇: How do you get a Process' main window handle in C#?