C# Process打开程序并移动窗口到指定位置
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");
p = Process.Start(psi); Thread.Sleep(100);//让程序停一会 MoveWindow(p.MainWindowHandle, 100, 100, 500, 200, true);
PS:测试了很久,发现直接在程序启动后就去执行MoveWindow函数,始终无法成功,最后想到一点会不会是窗口句柄还未生成,就让程序停了一会再跑 Thread.Sleep(100) 还真就成功了,提醒朋友们在使用时记得加上这句,或者还有其他机制我没发现的,也请高手帮忙指点一二,因为可能这种方法不一定能适应所有程序窗口。
PS.只更改窗体位置而不调整大小
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); //简单解释下就是第一个参数为你要控制的窗口,最后一个参数为控制位置生效还是大小生效等
分类:
C#
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· Blazor Hybrid适配到HarmonyOS系统
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· 分享4款.NET开源、免费、实用的商城系统
· 解决跨域问题的这6种方案,真香!
· 一套基于 Material Design 规范实现的 Blazor 和 Razor 通用组件库