C# 分屏显示窗口

songbing774933 2016-01-25 04:00:06
近期接到个需求,要求在指定显示器屏幕启动应用程序。

在网上查阅了下资料,可以通过System.Windows.Forms.Screen.AllScreens获取显示器列表。
但是,如何设置应用程序启动后在哪个屏幕显示没有一个好的办法。

只找到一个 bool SetWindowPos(IntPtr hWnd , IntPtr hWndInsertAfter , int x , int y , int cx , int cy , uint uFlags);

但是问题很多,最主要的是这个函数的第一个参数是窗口句柄,我是通过Process中的MainWindowHandle来获取,但是有的应用程序,MainWindowHandle只是刚启动的时候的一个loading窗口,并不是最终显示的实际工作窗口。


有人做过类似的需求吗?
...全文
549 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
sosoben 2016-01-25
  • 打赏
  • 举报
回复
引用 6 楼 songbing774933 的回复:
[quote=引用 4 楼 starfd 的回复:] 在process打开程序后,获取窗口句柄 然后通过windows api设置窗体位置 计算位置按之前那一篇文章来,我没试验过是否可行,这只是我的思路
引用 4 楼 starfd 的回复:
在process打开程序后,获取窗口句柄 然后通过windows api设置窗体位置 计算位置按之前那一篇文章来,我没试验过是否可行,这只是我的思路
关键就是 在process打开程序后,获取窗口句柄 MainWindowHandle存在已知就有两个问题: 1.例如QQ这种,exe只是一个类似引导的程序,exe启动后又启动了其他程序,本身马上就关闭了 2.还有些应用程序有一个loading界面,没有手动设置的话,程序会把第一个显示的window作为程序的MainWindow,但是我们实际需要设置的是后来才显示的那个工作window [/quote] 后来那个窗口跟一开始的那个窗口有没有从属关系? 在进程管理器的进程名一样吗? 后来弹出的窗口有它自己的进程名,你可以用过进程名获取MainWindowHandle啊。 再不行就循环findwindow,找到标题,类型跟你预设一致的窗口才停下。
月影 2016-01-25
  • 打赏
  • 举报
回复
引用 6 楼 songbing774933 的回复:
[quote=引用 4 楼 starfd 的回复:] 在process打开程序后,获取窗口句柄 然后通过windows api设置窗体位置 计算位置按之前那一篇文章来,我没试验过是否可行,这只是我的思路
引用 4 楼 starfd 的回复:
在process打开程序后,获取窗口句柄 然后通过windows api设置窗体位置 计算位置按之前那一篇文章来,我没试验过是否可行,这只是我的思路
关键就是 在process打开程序后,获取窗口句柄 MainWindowHandle存在已知就有两个问题: 1.例如QQ这种,exe只是一个类似引导的程序,exe启动后又启动了其他程序,本身马上就关闭了 2.还有些应用程序有一个loading界面,没有手动设置的话,程序会把第一个显示的window作为程序的MainWindow,但是我们实际需要设置的是后来才显示的那个工作window [/quote] UI Automation Library应该能做到你想要的功能。 君不见,好多自动化测试工具就可以完全控制一个进程的所有窗口吗?
songbing774933 2016-01-25
  • 打赏
  • 举报
回复
引用 5 楼 oysy 的回复:
我做过这样的程序, 其实你只要把几个显示器的位置定了,然后重置程序窗体的left和top,再放大全屏,程序会只在当时指定屏幕上全屏的 非常简单,别想太复杂了
是设置启动的第三方应用程序显示的屏幕 通过Process.Start(EXE路径) 来启动的
songbing774933 2016-01-25
  • 打赏
  • 举报
回复
引用 4 楼 starfd 的回复:
在process打开程序后,获取窗口句柄 然后通过windows api设置窗体位置 计算位置按之前那一篇文章来,我没试验过是否可行,这只是我的思路
引用 4 楼 starfd 的回复:
在process打开程序后,获取窗口句柄 然后通过windows api设置窗体位置 计算位置按之前那一篇文章来,我没试验过是否可行,这只是我的思路
关键就是 在process打开程序后,获取窗口句柄 MainWindowHandle存在已知就有两个问题: 1.例如QQ这种,exe只是一个类似引导的程序,exe启动后又启动了其他程序,本身马上就关闭了 2.还有些应用程序有一个loading界面,没有手动设置的话,程序会把第一个显示的window作为程序的MainWindow,但是我们实际需要设置的是后来才显示的那个工作window
飞天凤凰601 2016-01-25
  • 打赏
  • 举报
回复
我做过这样的程序, 其实你只要把几个显示器的位置定了,然后重置程序窗体的left和top,再放大全屏,程序会只在当时指定屏幕上全屏的 非常简单,别想太复杂了
  • 打赏
  • 举报
回复
在process打开程序后,获取窗口句柄 然后通过windows api设置窗体位置 计算位置按之前那一篇文章来,我没试验过是否可行,这只是我的思路
songbing774933 2016-01-25
  • 打赏
  • 举报
回复
引用 1 楼 starfd 的回复:
http://www.jb51.net/article/67263.htm
程序是用Process启动第三方应用程序,就是说只有一个应用程序exe的路径 没法获取程序的窗体的对象啊
songbing774933 2016-01-25
  • 打赏
  • 举报
回复
引用 1 楼 starfd 的回复:
http://www.jb51.net/article/67263.htm
并不是控制我写的程序启动在哪个屏幕 我写的程序是管理exe的,通过exe的路径启动exe,需求是设置exe启动后窗体显示到指定的屏幕

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧