下面的是我写的消息处理函数,其中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为什么?????
大家多帮忙呀!
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为什么?????
大家多帮忙呀!
#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;
}