有没有办法将表单设置为最后面的表单(无论您在表单上单击什么,表单始终保持在后面) 我正在写一个shell替换,并且只是在每个窗口上使用topmost,我开始为某些应用程序搞砸了一些东西。
谢谢!
答案 0 :(得分:0)
免责声明:这是完全未经测试的。
首先,在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。
答案 1 :(得分:0)
我找到了一个使用钩子来检测打开的窗口的替代方案。我正在打开所有新窗口(有parrent或没有parrent作为最顶层),它可以解决问题,并将shell界面放在后台应有的位置。非常简化的钩子函数看起来像这样:
`Public Sub WindowCreated(hwnd As Long)
如果不是hwnd = Me.hwnd那么 如果IsWindowVisible(hwnd)那么
WindowHandle hwnd, 6 ' set form as topmost and focused
WindowHandle hwnd, 5
结束如果 结束子