关于 SetParent API 的问题,它不适用于 Windows 11

Question about SetParent API, it doesn't work on Windows 11

提问人:Wesam Nafaa 提问时间:6/21/2023 更新时间:6/21/2023 访问量:54

问:

大家晚上好 对不起我平庸的英语

我有一个关于 SetParent API 的问题。当我在 Windows 10 上运行窗口时,它可以正常工作并包含我想要的任何程序

但是当程序在 Windows 11 上执行时,它什么都不做,例如,记事本正常运行并属于桌面,而不是我窗口中的容器。

这是我目前正在使用的:

Public Class WindowsApiSetAnyWindowParent
    Public Declare Function SetParent Lib "user32.dll" (
                                                       ByVal hWndChild As IntPtr,
                                                       ByVal hWndNewParent As IntPtr
                                                       ) As IntPtr
    Public Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongPtrA" (
                                                                                  ByVal hwnd As IntPtr,
                                                                                  ByVal nIndex As Integer,
                                                                                  ByVal dwNewLong As Long
                                                                                  ) As Long
    Public Declare Function MoveWindow Lib "user32.dll" (
                                                        ByVal hwnd As IntPtr,
                                                        ByVal x As Integer,
                                                        ByVal y As Integer,
                                                        ByVal cx As Integer,
                                                        ByVal cy As Integer,
                                                        ByVal repaint As Boolean
                                                        ) As Boolean
    Public Declare Function PostMessage Lib "user32.dll" Alias "PostMessageA" (
                                                                              ByVal hwnd As IntPtr,
                                                                              ByVal Msg As UInteger,
                                                                              ByVal wParam As Long,
                                                                              ByVal lParam As Long
                                                                              ) As Boolean
    Public Const SWP_NOOWNERZORDER As Integer = &H200
    Public Const SWP_NOREDRAW As Integer = &H8
    Public Const SWP_NOZORDER As Integer = &H4
    Public Const SWP_SHOWWINDOW As Integer = &H40
    Public Const WS_EX_MDICHILD As Integer = &H40
    Public Const SWP_FRAMECHANGED As Integer = &H20
    Public Const SWP_NOACTIVATE As Integer = &H10
    Public Const SWP_ASYNCWINDOWPOS As Integer = &H4000
    Public Const SWP_NOMOVE As Integer = &H2
    Public Const SWP_NOSIZE As Integer = &H1
    Public Const GWL_STYLE As Integer = -16
    Public Const WS_VISIBLE As Integer = &H10000000
    Public Const WM_CLOSE As Integer = &H10
    Public Const WS_CHILD As Integer = &H40000000
End Class

于是我打电话给:

Dim TheNotePad As ProcessStartInfo = New ProcessStartInfo("notepad.exe")
                        TheNotePad.WindowStyle = ProcessWindowStyle.Minimized
                        Dim TheProcess As Process = Process.Start(TheNotePad)
                        TheProcess.WaitForInputIdle()
                        WindowsApiSetAnyWindowParent.SetParent(TheProcess.MainWindowHandle, HostTabPanel.Handle)
                        WindowsApiSetAnyWindowParent.SetWindowLong(TheProcess.MainWindowHandle, WindowsApiSetAnyWindowParent.GWL_STYLE, WindowsApiSetAnyWindowParent.WS_VISIBLE)
                        WindowsApiSetAnyWindowParent.MoveWindow(TheProcess.MainWindowHandle, 0, 0, HostTabPanel.Width, HostTabPanel.Height, True)
                        TheNotePad.WindowStyle = ProcessWindowStyle.Normal

enter image description here

非常感谢您的帮助

进程StartInfo setParent 窗口样式 SetWindowLong MoveWindow

评论

0赞 Wesam Nafaa 6/21/2023
当我查看 TheProcess.MainWindowHandle 的值时,我发现在 Windows 11 中它始终为 0 似乎问题就源于这里

答: 暂无答案