如何使wx窗口成为另一个应用程序窗口的父窗口?

2024-06-02 06:52:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我想知道如何使另一个应用程序窗口成为我的wx窗口的父窗口。在

我知道这是可能的,因为twain模块就是这样做的。在

例如,你可以进去pygame.display的句柄,它将作为将出现的扫描对话框的父级。 您可以给它一个Tk()的句柄,或者wx.框架()直接(但无论如何它只会获取句柄号)。在

或者你可以传递一个完全不同的应用程序的句柄,比如记事本。在

我想实现这个目标。这样我的wx对话框或弹出窗口将以模式模式出现在另一个应用程序上。在

你已经推断出我想在微软Windows上做。 好吧,我想跨平台做,但其他平台不会那么愚蠢,让任何人在其他应用程序的界面上捣乱。 当然,我认为这是可能的,但要困难得多。因此,目前仅限于Windows。在

我想我需要效仿wx.窗口或框架或面板或其他基于所选窗口句柄的对象,以将其传递到我的对话框。或者类似的事情。在

有什么想法吗?在


Tags: 模块框架应用程序目标windowsdisplay模式句柄
2条回答
<> >我将在WxWIDGET(C/C++库)术语中进行讨论,例如,我的“WxFrAMP”将变成您的wx.框架.

wxWindow类有一个方法SetIdhttp://docs.wxwidgets.org/3.1/classwx_window.html)。所以您可以尝试使用默认构造函数创建wxWindow对象(我们称之为“ParrentWindow”),找出某个外部应用程序的某个窗口的id,并将该窗口id传递给我们的“ParrentWindow”对象的SetId方法。在

然后,您应该尝试将此对象用作某些窗口(wxWindow、wxFrame、wxPannel等)的父级:只需将“ParrentWindow”传递给新窗口对象的构造函数。在

也许会有用。在

但请记住(在现代版本的mswindows操作系统中),你的应用程序只能在你自己的Windows下运行。如果是这样的话,你需要在管理员帐户下运行你的应用程序。在

升级版:

我刚刚查看了MSDN,是的:您可以使用SetParent()win32api函数https://msdn.microsoft.com/en-us/library/windows/desktop/ms633541(v=vs.85).aspx更改已存在(已构建)窗口的父窗口

因此,您可以将User32.dll加载到Python代码中,并直接(通过使用默认的ctypes模块)或间接地(通过pywin32模块)使用这个win32api。你的父母和你的孩子需要的是外部窗口。并将它们传递到SetParent()win32api函数中。但您应该记住,使用win32api绕过wxWindows代码可能会导致(或可能不会)在适当的wxWindows对象中出现不一致。在

我没有解决我的问题。对我来说幸运的是,两个应用程序,客户机应用程序和我希望成为其父应用程序的应用程序都是我的,所以我使用wxPython重写了父应用程序,并在其中添加了必要的接口,即创建了新的应用程序。一开始我不愿意这么做,这就是为什么我寻找一个“育儿”的解决方案。在

然而,在这两年里,我偶然发现了一些有用的信息:

  1. 我发现了一个工厂函数,名为_CreateWindowFromNativeWindow()或_CreateWindowFromHandle()之类的。 这是wxPython中的一个内部函数,但据我所见,它可以从我们的代码中调用。但因为对它的热爱,我再也找不到它了。我没有试过,所以这只是一个提示。也许有人能把它挖出来。

  2. 我找到了方法wx.Window.AssociateHandle()然而,这是真实的,应该是有效的。我们不能创造一个wx.窗口()没有父母,但是wx.框架()我们可以。所以像这样:


f = wx.Frame(None)
f.AssociateHandle(hwnd)

应该行得通。现在f应该链接到另一个应用程序的本地窗口,如果hwnd是正确的,并且我们有适当的权限,我们应该能够将它作为其他wx窗口的父窗口使用。无论谁尝试,请发表评论,让我们知道它是否如预期的那样工作。在

如果我们知道如何让wxWidgets意识到操作系统改变了窗口的一个句柄,那么总有一个ctypes解决方案。我没有,因为我停下来朝那个方向看。另外,还有一种解决方案,通过修改wxPython源代码并构建它们,wxWidgets的未文档化方法setHWND()应该存在于某些源代码中。在

相关问题 更多 >