在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
process.start只是按指定的参数来运行一个程序,而这个程序自己运行起来是什么样子的就不是Process所能处理的了,不过当程序运行起来后倒是可以通过Process的MainWindowHandle来得到运行程序的主窗口的名柄.而通过这个句柄利用API函数MoveWindow来移动程序的主窗口. [DllImportAttribute("user32.dll", EntryPoint = "MoveWindow")] public static extern bool MoveWindow(System.IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint); ProcessStartInfo psi = new ProcessStartInfo(@"D:\EXE\FileControl.exe");
PS:测试了很久,发现直接在程序启动后就去执行MoveWindow函数,始终无法成功,最后想到一点会不会是窗口句柄还未生成,就让程序停了一会再跑 Thread.Sleep(100) 还真就成功了,提醒朋友们在使用时记得加上这句,或者还有其他机制我没发现的,也请高手帮忙指点一二,因为可能这种方法不一定能适应所有程序窗口。 MoveWindow相对功能还是简单了些,可控制的参数有限,为了实现只更改窗体位置,而不调整窗口大小,需要使用另一个API函数 SetWindowPos WinAPI: SetWindowPos - 改变窗口的位置与状态 SetWindowPos( hWnd: HWND; {窗口句柄} hWndInsertAfter: HWND; {窗口的 Z 顺序} X, Y: Integer; {位置} cx, cy: Integer; {大小} uFlags: UINT {选项} ): BOOL; //hWndInsertAfter 参数可选值: HWND_TOP = 0; {在前面} HWND_BOTTOM = 1; {在后面} HWND_TOPMOST = HWND(-1); {在前面, 位于任何顶部窗口的前面} HWND_NOTOPMOST = HWND(-2); {在前面, 位于其他顶部窗口的后面} //uFlags 参数可选值: SWP_NOSIZE = 1; {忽略 cx、cy, 保持大小} SWP_NOMOVE = 2; {忽略 X、Y, 不改变位置} SWP_NOZORDER = 4; {忽略 hWndInsertAfter, 保持 Z 顺序} SWP_NOREDRAW = 8; {不重绘} SWP_NOACTIVATE = $10; {不激活} SWP_FRAMECHANGED = $20; {强制发送 WM_NCCALCSIZE 消息, 一般只是在改变大小时才发送此消息} SWP_SHOWWINDOW = $40; {显示窗口} SWP_HIDEWINDOW = $80; {隐藏窗口} [DllImport("user32.dll")] private static extern bool SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int X, int Y, int cx, int cy, uint Flags); ProcessStartInfo psi = new ProcessStartInfo(@"D:\WinExe\ZGAccount\ZGAccount.exe"); Process p = Process.Start(psi); Thread.Sleep(500);//让程序停一会 //MoveWindow(p.MainWindowHandle, 0, 100, 500, 200, true); SetWindowPos(p.MainWindowHandle, 0, 0, 100, 0, 0, 1); //简单解释下就是第一个参数为你要控制的窗口,最后一个参数为控制位置生效还是大小生效等 |
请发表评论