下面的是我写的消息处理函数,其中WM_HOOK是钩子处理函数发送的自定义消息。
WM_HOOK的lParam为一个字符数组(如"OK")。BOOL CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
TCHAR *letter;

switch (message)
{
case WM_INITDIALOG:
InstallHook(hDlg, WM_HOOK);
break;
case WM_CLOSE:
UninstallHook();
EndDialog(hDlg, 0);
break;
case WM_HOOK:
letter = (LPSTR)lParam;
strcat(szBuffer, letter);

// SendDlgItemMessage(hDlg, IDC_EDIT, EM_REPLACESEL, 0, (WPARAM)lParam);
// SendDlgItemMessage(hDlg, IDC_EDIT, WM_SETTEXT, 0, (WPARAM)szBuffer);
SetDlgItemText(hDlg, IDC_EDIT,szBuffer);
break;
default:
return FALSE;
} return TRUE;
}
在WM_HOOK中,szBuffer中的内容如果是j时,IDC_EDIT的显示确是jj如:键盘按下ok
   则显示ookk为什么?????
大家多帮忙呀!

解决方案 »

  1.   

    头文件:
    #ifndef MYHOOK_H
    #define MYHOOK_H//HINSTANCE hInstance;void GetValue(HINSTANCE **lphInstance);
    void InstallHook(HWND hWnd, UINT message);
    void UninstallHook();#endif钩子代码:
    #include <windows.h>
    #include "myhook.h"
    HHOOK hHook;
    BYTE szAscii[4];
    HWND hDlg;
    UINT myMessage;HINSTANCE hInstance;void GetValue(HINSTANCE **lphInstance)
    {
    *lphInstance = &hInstance;
    }void HookProc(DWORD dwCode, WPARAM wParam, LPARAM lParam)
    {
    BYTE szKeyState[256];
    SHORT virKey;
    INT retToAscii; CallNextHookEx(hHook, dwCode, wParam, lParam);
    GetKeyboardState(szKeyState);
    virKey = GetKeyState(VK_SHIFT);
    szKeyState[VK_SHIFT] = (BYTE)virKey;
    retToAscii = ToAscii(wParam, LOWORD(lParam), szKeyState, (LPWORD)szAscii, 0);
    szAscii[retToAscii] = 0;
    SendMessage(hDlg, myMessage, 0, (WPARAM)szAscii);
    }void InstallHook(HWND hWnd, UINT message)
    {
    hDlg = hWnd;
    myMessage = message; hHook = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)HookProc, hInstance, 0);
    }void UninstallHook()
    {
    UnhookWindowsHookEx(hHook);
    }使用钩子:
    #include <windows.h>
    #include "resource.h"
    #include "../MyHook/myhook.h"#define WM_HOOK WM_USER + 0X100#pragma comment(lib, "./Release/myhook.lib")HINSTANCE *hInstance;
    TCHAR szBuffer[1024];
    BOOL CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
    void HookProc(DWORD dwCode, WPARAM wParam, LPARAM lParam);int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
    {
    GetValue(&hInstance);
    *hInstance = hInst; DialogBoxParam(hInst, (LPCTSTR)IDD_DIALOG, NULL, (DLGPROC)DlgProc, 0);
    return 0;
    }BOOL CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
    {
    TCHAR *letter;

    switch (message)
    {
    case WM_INITDIALOG:
    InstallHook(hDlg, WM_HOOK);
    break;
    case WM_CLOSE:
    UninstallHook();
    EndDialog(hDlg, 0);
    break;
    /* case WM_HOOK:
    letter = (LPSTR)lParam;
    strcat(szBuffer, letter);

    // SendDlgItemMessage(hDlg, IDC_EDIT, EM_REPLACESEL, 0, (WPARAM)lParam);
    // SendDlgItemMessage(hDlg, IDC_EDIT, WM_SETTEXT, 0, (WPARAM)szBuffer);
    SetDlgItemText(hDlg, IDC_EDIT,szBuffer);
    break;
    */
    case WM_KEYDOWN:
    letter = (LPSTR)lParam;
    strcat(szBuffer, letter);

    // SendDlgItemMessage(hDlg, IDC_EDIT, EM_REPLACESEL, 0, (WPARAM)lParam);
    // SendDlgItemMessage(hDlg, IDC_EDIT, WM_SETTEXT, 0, (WPARAM)szBuffer);
    SetDlgItemText(hDlg, IDC_EDIT,szBuffer);
    break;
    default:
    return FALSE;
    } return TRUE;
    }
      

  2.   

    问题已经解决,是因为键盘钩子捕获了WM_KEYDOWN和WM_KEYUP。将ToAscii的第二参数右移16位即可。