首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

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

2012-02-11 
高手帮看看下面一段代码吧模块代码如下:OptionExplicitPublicDeclareFunctionSetWindowsHookExLibuser32

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

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

热点排行