Shell 将窗体设置为最后面。始终保持在后台的窗体-vb6

Shell 将窗体设置为最后面。始终保持在后台的窗体-vb6,shell,vb6,desktop,Shell,Vb6,Desktop,有没有办法将表单设置为最靠后的表单(无论您在表单上单击什么,表单都始终位于后面) 我正在编写一个shell替换程序,只是在我启动的每个窗口上使用topmost,这确实会使某些应用程序的某些方面出现问题。免责声明:这是完全未经测试的 首先,在Form_Load上,您需要使用SetWindowPos API将您的表单置于所有其他表单之下: Private Const SWP_NOSIZE = &H1 Private Const SWP_NOMOVE = &H2 Private Con

有没有办法将表单设置为最靠后的表单(无论您在表单上单击什么,表单都始终位于后面)


我正在编写一个shell替换程序,只是在我启动的每个窗口上使用topmost,这确实会使某些应用程序的某些方面出现问题。

免责声明:这是完全未经测试的

首先,在Form_Load上,您需要使用SetWindowPos API将您的表单置于所有其他表单之下:

Private Const SWP_NOSIZE = &H1
Private Const SWP_NOMOVE = &H2
Private Const HWND_BOTTOM = 1

Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long

' Somewhere in form_load...    
RetVal = SetWindowPos(Me.hwnd, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE)

如果这还不够,您可能需要对表单进行子类化,并监视WM_ACTIVATE和/或WM_MOUSEACTIVATE并重定向这些消息。对于WM_MOUSEACTIVATE,重定向到MA_NOACTIVATE可能会起作用;对于WM_ACTIVATE消息,重定向到WA_INACTIVE。

我找到了一种使用钩子检测打开窗口的替代方法。我正在打开所有新窗口(最上面是parrent或no parrent),这很好地解决了这个问题,并将shell界面放在了背景中。非常简化的hooked函数如下所示:

`Public Sub WindowCreated(hwnd As Long)
如果不是hwnd=Me.hwnd,则 如果IsWindowVisible(hwnd),则

如果结束 端接头`

      WindowHandle hwnd, 6 ' set form as topmost and focused
        WindowHandle hwnd, 5