将窗口停靠在另一个窗口内
我有一个 winform 应用程序(.NET 2.0 C#)。从这个应用程序中,我想启动另一个进程(另一个 winform 应用程序)并将其停靠到我的窗口(或至少使其看起来像是停靠的)。到目前为止,我只能找到有关停靠控件的信息,而找不到单独进程中的窗口的信息。我的第一个想法是获取窗口的句柄并使用非托管系统调用将窗口的高度/宽度和位置设置到我的停靠区域。但在开始之前,我想看看你们中是否有好人做过类似的事情。我可以访问我想要停靠的应用程序的源代码,但如果可以避免的话,我宁愿不进行任何更改。我对父应用程序有完全的编程控制。有什么建议吗?提前致谢!
I have a winform application (.NET 2.0 C#). From this application, I want to start another process (another winform application) and dock it to my window (or at least make it look like it is docked). So far, I can only find information about docking controls, not windows in separate processes. My first thought is to get the handle of the window and use unmanaged system calls to set the height/width and position of the window to my docking area. But before I got started, I wanted to check to see if any of you good people have done something similar. I have access to the source code of the application I want docked but would rather not make any changes if I can avoid it. I have complete programming control over what will be the parent application. Any advice? Thanks in advance!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
我之前使用的解决方案是将应用程序窗口设置为要停靠它的控件的子级。
The solution I have used before is to set the application window as a child of the control you want to dock it in.
* 在答案中添加一些解决方案..**
此代码帮助我在 Windows 窗体中停靠一些可执行文件。例如记事本、Excel、word、Acrobat reader 等等...
但它不适用于某些应用程序。
有时当您启动某些应用程序的进程时...等待空闲时间...并尝试获取其 mainWindowHandle...直到主窗口句柄变为空...
所以我做了一个解决这个问题的技巧
如果你得到的主窗口句柄为空...然后搜索系统上所有正在运行的进程并找到你的进程...然后获取进程的主句柄并将设置面板作为其父级。
* Adding some solution in Answer..**
This code has helped me to dock some executable in windows form. like NotePad, Excel, word, Acrobat reader n many more...
But it wont work for some applications.
As sometimes when you start process of some application.... wait for idle time... and the try to get its mainWindowHandle.... till the time the main window handle becomes null.....
so I have done one trick to solve this
If you get main window handle as null... then search all the runnning processes on sytem and find you process ... then get the main hadle of the process and the set panel as its parent.
这比我希望的要笨重得多,但到目前为止还有效。我正在使用系统调用来强制子窗口位于反映停靠区域的位置。它还没有完美运行。我遇到了一些由
HWND_TOPMOST
引起的奇怪现象,我仍然需要添加逻辑以防止用户直接移动子窗口。This is a lot clunkier than I hoped for, but working so far. I am using system calls to force the child window in the location that reflects the docking area. It is not working perfectly yet. I get a few oddities caused by the
HWND_TOPMOST
and I still need to add logic preventing the user from moving the child window directly.