先用Getwindow找到窗体句柄,再用SetWindowPosVB声明 
Declare Function SetWindowPos Lib "user32" Alias "SetWindowPos" (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 
说明 
这个函数能为窗口指定一个新位置和状态。它也可改变窗口在内部窗口列表中的位置。该函数与DeferWindowPos函数相似,只是它的作用是立即表现出来的(在vb里使用:针对vb窗体,如它们在win32下屏蔽或最小化,则需重设最顶部状态。如有必要,请用一个子类处理模块来重设最顶部状态 
返回值 
Long,非零表示成功,零表示失败。会设置GetLastError 
参数表 
参数 类型及说明 
hwnd Long,欲定位的窗口 
hWndInsertAfter Long,窗口句柄。在窗口列表中,窗口hwnd会置于这个窗口句柄的后面。也可能选用下述值之一: 
HWND_BOTTOM 将窗口置于窗口列表底部 
HWND_TOP 将窗口置于Z序列的顶部;Z序列代表在分级结构中,窗口针对一个给定级别的窗口显示的顺序 
HWND_TOPMOST 将窗口置于列表顶部,并位于任何最顶部窗口的前面 
HWND_NOTOPMOST 将窗口置于列表顶部,并位于任何最顶部窗口的后面 
x Long,窗口新的x坐标。如hwnd是一个子窗口,则x用父窗口的客户区坐标表示 
y Long,窗口新的y坐标。如hwnd是一个子窗口,则y用父窗口的客户区坐标表示 
cx Long,指定新的窗口宽度 
cy Long,指定新的窗口高度 
wFlags Long,包含了旗标的一个整数 
SWP_DRAWFRAME 围绕窗口画一个框 
SWP_HIDEWINDOW 隐藏窗口 
SWP_NOACTIVATE 不激活窗口 
SWP_NOMOVE 保持当前位置(x和y设定将被忽略) 
SWP_NOREDRAW 窗口不自动重画 
SWP_NOSIZE 保持当前大小(cx和cy会被忽略) 
SWP_NOZORDER 保持窗口在列表的当前位置(hWndInsertAfter将被忽略) 
SWP_SHOWWINDOW 显示窗口 
SWP_FRAMECHANGED 强迫一条WM_NCCALCSIZE消息进入窗口,即使窗口的大小没有改变 
注解 
窗口成为最顶级窗口后,它下属的所有窗口也会进入最顶级。一旦将其设为非最顶级,则它的所有下属和物主窗口也会转为非最顶级。Z序列用垂直于屏幕的一根假想Z轴量化这种从顶部到底部排列的窗口顺序
 
VB声明 
Declare Function GetWindow Lib "user32" Alias "GetWindow" (ByVal hwnd As Long, ByVal wCmd As Long) As Long 
说明 
获得一个窗口的句柄,该窗口与某源窗口有特定的关系 
返回值 
Long,由wCmd决定的一个窗口的句柄。如没有找到相符窗口,或者遇到错误,则返回零值。会设置GetLastError 
参数表 
参数 类型及说明 
hwnd Long,源窗口 
wCmd Long,指定结果窗口与源窗口的关系,它们建立在下述常数基础上: 
GW_CHILD 寻找源窗口的第一个子窗口 
GW_HWNDFIRST 为一个源子窗口寻找第一个兄弟(同级)窗口,或寻找第一个顶级窗口 
GW_HWNDLAST 为一个源子窗口寻找最后一个兄弟(同级)窗口,或寻找最后一个顶级窗口 
GW_HWNDNEXT 为源窗口寻找下一个兄弟窗口 
GW_HWNDPREV 为源窗口寻找前一个兄弟窗口 
GW_OWNER 寻找窗口的所有者 
注解 
兄弟或同级是指在整个分级结构中位于同一级别的窗口。如某个窗口有五个子窗口,那五个窗口就是兄弟窗口。尽管GetWindow可用于枚举窗口,但倘若要在枚举过程中重新定位、创建和清除窗口,那么EnumWindows和EnumChildWindows更为可靠
 

解决方案 »

  1.   

    '以下在FormPrivate Sub Command1_Click()
    Call EnableHook
    '中文操作系统WindowTitle = "颜色" 'or "打开" ...
    CommonDialog1.ShowColor 'or CommonDialog1.ShowOpen ...
    Call FreeHook
    End Sub'///////////////////////////////////////'以下程式在.BasDeclare Function MoveWindow Lib "user32" (ByVal hwnd As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal bRepaint As Long) As Long
    Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
    Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
    Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, lparam As Any) As Long
    Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
    Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long
    Type RECT
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
    End Type
    Public Const HCBT_ACTIVATE = 5
    Public Const WH_CBT = 5
    Public hHook As Long
    Public WindowTitle As StringPublic Sub EnableHook()
    If hHook = 0 Then
        hHook = SetWindowsHookEx(WH_CBT, AddressOf HookProc, 0, App.ThreadID)
    End If
    End Sub
    Public Sub FreeHook()
    If hHook <> 0 Then
        Call UnhookWindowsHookEx(hHook)
        hHook = 0
    End If
    End SubPublic Function HookProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lparam As Long) As Long
    Dim m_Width, m_Height, m_Left, m_Top
    Dim pRECT As RECT
    If nCode < 0 Then
        HookProc = CallNextHookEx(hHook, nCode, wParam, lparam)
        Exit Function
    End If
    '当MsgBox Activate之前去更改Button的标题
    If nCode = HCBT_ACTIVATE Then
        Dim str5 As String
        Dim len5 As Long, i As Long
        str5 = String(255, 0)
        len5 = 256
        i = GetWindowText(wParam, str5, len5)
        str5 = Left(str5, InStr(1, str5, Chr(0)) - 1)
        '如果Active Window上的标题是MsgBox上的标题
        If str5 = WindowTitle Then    GetWindowRect wParam, pRECT
        m_Width = pRECT.Right - pRECT.Left
        m_Height = pRECT.Bottom - pRECT.Top
        m_Left = (Screen.Width \ Screen.TwipsPerPixelX - m_Width) \ 2
        m_Top = (Screen.Height \ Screen.TwipsPerPixelY - m_Height) \ 2    '让颜色显示框居中
        MoveWindow wParam, m_Left, m_Top, m_Width, m_Height, 0    End If
        End If
    HookProc = 0 '令待完成的动作继续完成,若为1,则取消原本要完成的动作
    End Function