高手帮看看下面一段代码吧
模块代码如下:
Option Explicit
Public 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
Public Declare Function UnhookWindowsHookEx Lib "user32 " (ByVal hHook As Long) As Long
Public Declare Function CallNextHookEx Lib "user32 " (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, lParam As Any) As Long
Public Declare Sub CopyMemory Lib "kernel32 " Alias "RtlMoveMemory " (lpvDest As Any, ByVal lpvSource As Long, ByVal cbCopy As Long)
Public Declare Function ImmGetContext Lib "imm32.dll " (ByVal hwnd As Long) As Long
Public Declare Function ImmGetCompositionString Lib "imm32.dll " Alias "ImmGetCompositionStringA " (ByVal himc As Long, ByVal dw As Long, lpv As Any, ByVal dw2 As Long) As Long
Public Declare Function ImmReleaseContext Lib "imm32.dll " (ByVal hwnd As Long, ByVal himc As Long) As Long
Public Type PMSG
hwnd As Long
message As Long
wParam As Long
lParam As Long
time As Long
pt As Long
End Type
Public Const WH_GETMESSAGE = 3
Public Const VK_LWIN = &H5B
Public Const VK_RWIN = &H5C
Public Const VK_CONTROL = &H11
Public Const VK_TAB = &H9
Public Const VK_SHIFT = &H10
Public Const HC_ACTION = 0
Public Const HC_SYSMODALOFF = 5
Public Const HC_SYSMODALON = 4
Public Const WM_KEYDOWN = &H100
Public Const WM_KEYUP = &H101
Public Const WM_SYSKEYDOWN = &H104
Public Const WM_SYSKEYUP = &H105
Public Const LLKHF_ALTDOWN = &H20
Public Const VK_ESCAPE = &H1B
Public Const WM_IME_COMPOSITION = &H10F
Public Const GCS_RESULTSTR = &H800
Public P As KEYMSGS
Public mm As PMSG
Public lHook As Long
Public Function MessageProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim himc As Long, hwnd As Long, dwsize As Long
Dim lpstr As String * 20
If (nCode = HC_ACTION) Then
CopyMemory mm, ByVal lParam, Len(mm)
If mm.message = WM_IME_COMPOSITION Then
hwnd = mm.hwnd
If mm.lParam & GCS_RESULTSTR Then
himc = ImmGetContext(hwnd)
If himc = 0 Then
Debug.Print "get himc error "
End If
dwsize = ImmGetCompositionString(himc, GCS_RESULTSTR, Null, 0)
dwsize = dwsize + 2
ImmGetCompositionString himc, GCS_RESULTSTR, lpstr, dwsize
Debug.Print lpstr
ImmReleaseContext hwnd, himc
End If
End If
End If
MessageProc = CallNextHookEx(lHook, nCode, wParam, ByVal lParam)
End Function
窗体代码很简单
Private Sub Command1_Click()
lHook = SetWindowsHookEx(WH_GETMESSAGE, AddressOf MessageProc, App.hInstance, 0)
End Sub
Private Sub Command2_Click()
UnhookWindowsHookEx lHook
End Sub
问题是始终捕获不到WM_IME_COMPOSITION 消息
请大家帮看看是什么问题,
比如pmsg数据结构的定义是否正确?
Public Function MessageProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
定义是否正确
[解决办法]
把lHook = SetWindowsHookEx(WH_GETMESSAGE, AddressOf MessageProc, App.hInstance, 0)这句改成
lHook = SetWindowsHookEx(WH_GETMESSAGE, AddressOf MessageProc, App.hInstance, App.ThreadID)即可
[解决办法]
你要全局的话必须要用DLL来完成
[解决办法]
顶陈兄,呵呵