1.需求分析
一用户要求实现输入某个按键时,能接连触发多个其他按键,类似按键精灵那种,这里对用户的用途保密。这里牵涉到两个问题,1.检测键盘输入 2.模拟键盘输入
2.解决方案
采用键盘钩子和模拟键盘按键解决
3.代码部分
LPDWORD g_lpdwVirtualKey = NULL;
int g_nLength = 0;
BOOL g_bDisableKeyboard = FALSE;
HINSTANCE g_hInstance = NULL;
HHOOK g_hHook = NULL;
HWND g_hMainHwnd = NULL;
UINT g_nCallbackMsg = 0;
LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode == HC_ACTION)
{
KBDLLHOOKSTRUCT* pStruct = (KBDLLHOOKSTRUCT*)lParam;
if (g_hMainHwnd != NULL && ((UINT)wParam == WM_KEYDOWN))
{
if (::IsWindowVisible(g_hMainHwnd))
{
LPDWORD tmpVirtualKey = g_lpdwVirtualKey;
for (int i = 0; i < g_nLength; i++)
{
if (pStruct->vkCode == *tmpVirtualKey++)
{
::PostMessage(g_hMainHwnd, g_nCallbackMsg, wParam, pStruct->vkCode);
}
}
}
}
}
return CallNextHookEx(g_hHook, nCode, wParam, lParam);
}
/********************************************************************/
/********************************************************************/
BOOL StartMaskKey(HWND hWnd, UINT nCallbackMsg, LPDWORD lpdwVirtualKey, int nLength)
{
if (g_hHook != NULL) return FALSE;
if (g_lpdwVirtualKey != NULL)
{
free(g_lpdwVirtualKey);
g_lpdwVirtualKey = NULL;
}
g_lpdwVirtualKey = (LPDWORD)malloc(sizeof(DWORD) * nLength);
LPDWORD tmpVirtualKey = g_lpdwVirtualKey;
for (int i = 0; i < nLength; i++)
{
*tmpVirtualKey++ = *lpdwVirtualKey++;
}
g_nLength = nLength;
g_hMainHwnd = hWnd;
g_nCallbackMsg = nCallbackMsg;
g_hHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, g_hInstance, NULL);
if (g_hHook == NULL) return FALSE;
return TRUE;
}
/********************************************************************/
/********************************************************************/
BOOL StopMaskKey()
{
if (UnhookWindowsHookEx(g_hHook) == 0)
{
if (g_lpdwVirtualKey)
{
free(g_lpdwVirtualKey);
g_lpdwVirtualKey = NULL;
}
return FALSE;
}
g_hHook = NULL;
if (g_lpdwVirtualKey)
{
free(g_lpdwVirtualKey);
g_lpdwVirtualKey = NULL;
}
return TRUE;
}
keybd_event(VK_RETURN, 0, 0, 0);
keybd_event(VK_RETURN, 0, KEYEVENTF_KEYUP, 0);