将表单设置为最后面的。始终保留在背景中的表单 - vb6

时间:2010-10-04 11:51:28

标签: shell vb6 desktop

有没有办法将表单设置为最后面的表单(无论您在表单上单击什么,表单始终保持在后面) 我正在写一个shell替换,并且只是在每个窗口上使用topmost,我开始为某些应用程序搞砸了一些东西。

谢谢!

2 个答案:

答案 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

结束如果 结束子