终于解决:把这一句: i = MoveWindow(iValue, 800, 600, 260, 150, True) 换为: i = MoveWindow(wParam, 800, 600, 260, 150, True)
解决方案 »
- 关于字符串处理学习的新问题
- ▲XP下找不到的文件!!
- 请问vc++和vb哪一个更好学?
- 我做了一个程序,有关仓库的借出还入,不能安装。
- (菜鸟问题)组件里用到了一个第三方的api库xx.dll每次用都要一起copy,能否把第三方的api库封装到组件里
- vb2008保存DataGridView到数据库的问题,高手帮一下忙
- VB 初学者,应该怎么做ini 文件呢?和怎样在VB中调用。
- msflexgrid合并单元格在打印时没有按合并的显示
- winsock控件,在客户端非法关机以后,服务端如何知道网络己断开?
- vb中怎样知道自己机器的网络域名???
- 为什么我只能打开一次文件???
- 下午要去面试了,兄弟们给点建议!
我只想移动msgbox
添加如下声明:
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())
把你的这段去掉即可:
If nCode < 0 Then 去掉此行
HookProc = CallNextHookEx(hHook, nCode, wParam, lparam)
Exit Function 去掉此行
End If 去掉此行
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 我真是服了你啦!这是我改后的,没问题,你试试吧!