Есть программа которая эмулирует нажатие клавиш
void CfgdfgDlg::OnBnClickedButton1()
{
int Len, DropLen;
CString buffDroped;
WORD w;
//Строка которую мы будем эмулировать
buffDroped = TEXT("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
DropLen = buffDroped.GetLength();
for (int i=0;i<DropLen;i++)
{
Len = buffDroped.GetLength();
if (Len>i)
{
w = VkKeyScan(buffDroped[i]);
if ((HIBYTE(w) != 0xFF) && (LOBYTE(w) != 0xFF))
{
if (HIBYTE(w))
{
keybd_event(VK_SHIFT, 0, 0, 0);
//Sleep(50);
}
keybd_event(LOBYTE(w),0,0,0);
keybd_event(LOBYTE(w),0,KEYEVENTF_KEYUP,0);
if (HIBYTE(w))
{
keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
}
}
}
}
}
и программа которая ловит нажатие клавиш (HOOK)
HHOOK hKeyHook = NULL;
WORD GetSymbolFromVK(WPARAM wParam, UINT scanecode)
{
BYTE btKeyState[256];
HKL hklLayout = GetKeyboardLayout(0);
WORD Symbol = NULL;
GetKeyboardState(btKeyState);
if ((ToAsciiEx(wParam, scanecode, btKeyState, &Symbol, 0, hklLayout) == 1) &&
(GetKeyState(VK_CONTROL) >= 0) && (GetKeyState(VK_MENU) >= 0))
return Symbol;
return -1;
}
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
WORD wc = 0;
if (nCode >= HC_ACTION)
{
//Если действие было - нажатие кнопочки
if (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN)
{
//Получаем символ
if ((wc = GetSymbolFromVK(((PKBDLLHOOKSTRUCT)lParam)->vkCode, ((PKBDLLHOOKSTRUCT)lParam)->scanCode)) != -1)
{
//Проверяем если он печатемый
if (iswprint(wc))
{
//обработка символа
}
}
}
}
return CallNextHookEx(hKeyHook, nCode, wParam, lParam);
}
BOOL SetKeyboardHook(BOOL Hook)
{
HMODULE hInstance = GetModuleHandle(NULL);
if (Hook)
{
hKeyHook = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)KeyboardProc, hInstance, NULL);
return (hKeyHook != NULL);
}
else
{
UnhookWindowsHookEx(hKeyHook);
hKeyHook = NULL;
return (hKeyHook != NULL);
}
}
При перехвате нажатий клавиш с клавиатуры всё работает как надо, а при перехвате эмуляции клавиш иногда возникают проблемы с сиволами которые печатаются с клавишей "SHIFT" т.е.: !"№;%:?*() и тд.
Например если мы будем эмулировать строку !!23456789??
то наш hook ловит и преобразовывает их в символы !1@3456789/?
SHIFT пременился не для второго символа а для третьего и для предпоследнего он не применился(((, а если после эмуляции нажатия SHIFT поставить Sleep(50); то всё нормально. Но Sleep не есть good!! Как можно обойтись без Sleep и других задержек.
16.09.09 20:59: Перенесено модератором из 'C/C++' — Кодт