终于解决:把这一句:  i = MoveWindow(iValue, 800, 600, 260, 150, True)           换为:    i = MoveWindow(wParam, 800, 600, 260, 150, True)

解决方案 »

  1.   

    但是msgbox框和父窗口都移动到这个位置啦。
    我只想移动msgbox
      

  2.   


      添加如下声明:
    Private Declare Function GetCurrentThreadId Lib "KERNEL32" () As Long
      
      把这句:
      hHook = SetWindowsHookEx(WH_CBT, AddressOf HookProc, 0, App.ThreadID)
      改为:
       hHook = SetWindowsHookEx(WH_CBT, _
              AddressOf HookProc, _
                         App.hInstance, _
                     GetCurrentThreadId())
      
      

  3.   

    我试过啦,当第一次运行时正确,但当点击msgbox中的否按钮时,回调函数又把父窗口移到了msgbox的位置去啦。请再想想办法。
      

  4.   


      把你的这段去掉即可:
    If nCode < 0 Then  去掉此行
        HookProc = CallNextHookEx(hHook, nCode, wParam, lparam)
        Exit Function  去掉此行
    End If  去掉此行
      

  5.   

    Private Declare Function GetCurrentThreadId Lib "KERNEL32" () 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 SetWindowText Lib "user32" Alias "SetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String) As Long
    Declare Function EnumChildWindows Lib "user32" (ByVal hWndParent As Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
    Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
    Declare 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 GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long
    Public Const HCBT_ACTIVATE = 5
    Public Const WH_CBT = 5
    Public Const SWP_HIDEWINDOW = &H80
    Public Const SWP_SHOWWINDOW = &H40
    Public Const GW_CHILD = 5
    Public Const GW_HWNDNEXT = 2
    Public hHook, iValue As Long
    Public MsgBoxTitle As StringPublic Sub EnableHook()
    If hHook = 0 Then
        'hHook = SetWindowsHookEx(WH_CBT, AddressOf HookProc, 0, App.ThreadID)
        
       hHook = SetWindowsHookEx(WH_CBT, _
              AddressOf HookProc, _
                         App.hInstance, _
                     GetCurrentThreadId())
        
    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
        
        HookProc = CallNextHookEx(hHook, nCode, wParam, lParam)
    '当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)
      
        If str5 = MsgBoxTitle Then
          '取得MsgBox上的所有子window
          i = MoveWindow(wParam, 800, 600, 260, 150, True)
          Call EnumChildWindows(wParam, AddressOf ChgButtonTitle, 0)
      
        End If
    End If
    HookProc = 0 '令待完成的动作继续完成,若为1,则取消原本要完成的动作
    End FunctionPrivate Function ChgButtonTitle(ByVal hwnd As Long, ByVal lParam As Long) As Long
    Dim clsName As String, len5 As Long, i As Long
    Dim Title As String
    If hwnd = 0 Then
        ChgButtonTitle = 0
        Exit Function
    End If
    clsName = String(255, 0)
    len5 = 256
    i = GetClassName(hwnd, clsName, 256)
    clsName = Left(clsName, InStr(1, clsName, Chr(0)) - 1)
    Title = String(255, 0)
    i = GetWindowText(hwnd, Title, 256)
    Title = Left(Title, InStr(1, Title, Chr(0)) - 1)
    '找到Button型态的子Window,并更改其上的标题
    If clsName = "Button" Then
        If Title = "是(&Y)" Then
          Call SetWindowText(hwnd, "Yes(&Y)")
        Else
          If Title = "否(&N)" Then
          Call SetWindowText(hwnd, "No(&N)")
          End If
        End If
    End If
    ChgButtonTitle = 1 '表示继续找下一个子Window
    End Function     我真是服了你啦!这是我改后的,没问题,你试试吧!