读书人

高手帮看看下面一段代码吧解决办法

发布时间: 2012-02-11 09:51:35 作者: rapoo

高手帮看看下面一段代码吧
模块代码如下:

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来完成
[解决办法]
顶陈兄,呵呵

读书人网 >VB

热点推荐