Привет.
В загруженном в OleContainer'е MS Word - сменить раскладку нажатием альт + шифт нельзя. Но работает Шифт + альт + альт. Сделал хук на клавиатуру - перехватывает Альт + Шифт и отправляет на ввод Шифт + Альт + Альт.
Проблема - С левым Альт+Шифт все работает отлично. Но при нажатии правого Альт + Шифт - OleContainer подвисает не надолго и теряет фокус, тоже самое если ЛевыйАльт (ЛевыйШифт) и ПравыйШифт (Правый Альт).
После использования правых Альт либо Шифт - до этого нормально работающая комба ЛевыйАльт + ЛевыйШифт начинает дико тормозить
Не могу понять почему. Команды отправляю с помощью SendInput
| Код | library hookDLL;
uses .... const WM_KEYEVENT = WM_USER+1;
var HookHandle: HHOOK; KeybrdState:TKeyboardState; keycombo:boolean;
//Смена раскладки procedure ChangeLayout(); var KeyInputs : Array of TInput; KeyInputCount : Integer; //Запись команд в массив для SendInput procedure KeyBdInput(VKey : Byte; Flags : DWord); begin {1} Inc(KeyInputCount); SetLength(KeyInputs, KeyInputCount); KeyInputs[KeyInputCount - 1].Itype := INPUT_KEYBOARD; with KeyInputs[KeyInputCount - 1].ki do begin {2} wVk := VKey; wScan := MapVirtualKey(wVk, 0); dwFlags := KEYEVENTF_EXTENDEDKEY; dwFlags := Flags or dwFlags; time := 0; dwExtraInfo := 0; end; {2} end; {1} begin KeyBdInput(VK_LSHIFT, 0); KeyBdInput(VK_LMENU, 0); KeyBdInput(VK_LMENU, KEYEVENTF_KEYUP); KeyBdInput(VK_LMENU, 0); KeyBdInput(VK_LMENU, KEYEVENTF_KEYUP); KeyBdInput(VK_LSHIFT, KEYEVENTF_KEYUP); SendInput(KeyInputCount, KeyInputs[0], SizeOf(KeyInputs[0])); end;
function KeyHook(CODE, WParam, LParam: DWORD): DWORD; stdcall; var ServerWnd: THandle; ScanCode:integer; winname:PChar; hkl_:HKL; LeftShift, LeftAlt, LeftButtons : boolean; RightShift, RightAlt, RightButtons : boolean; begin LeftButtons := false; RightButtons := false; winname := 'Edit ActiveX Control -'; if (CODE = HC_ACTION) and ((lparam and $80000000) <> $80000000) then begin LeftShift := GetAsyncKeyState(VK_LSHIFT) <> 0; LeftAlt := GetAsyncKeyState(VK_LMENU) <> 0; LeftButtons := LeftShift and LeftAlt;
RightShift := GetAsyncKeyState(VK_RSHIFT) <> 0; RightAlt := GetAsyncKeyState(VK_RMENU) <> 0; RightButtons := RightShift and RightAlt;
if (LeftButtons) or (RightButtons) or (LeftAlt and RightShift) or (RightAlt and LeftShift) then begin ChangeLayout(); end; end; Result:=CallNextHookEx(HookHandle, code, WParam, LParam); end;
procedure SetKeyHook; stdcall; export; begin if HookHandle=0 then begin keycombo:= false; HookHandle:=SetWindowsHookEx(WH_KEYBOARD, @KeyHook, hInstance, 0); end; end;
procedure DelKeyHook; stdcall; export; begin if HookHandle <> 0 then UnhookWindowsHookEx(HookHandle); HookHandle:=0; end;
exports SetKeyHook, DelKeyHook; begin end.
|
Спасибо за любую помощь! |