Цитата:
Сообщение от Alegun
Ещё раз попробуйте
|
Очень остроумный совет. Хотя, надо признать, я сам виноват в его появлении. Сейчас опишу проблему подробнее.
С отсылкой клавиатурных сообщений как таковых проблем нет вообще - игра их распознают и реагирует должным образом. При этом не важно - использую я PostMessage, keybd_event или SendInput.
Проблема возникает при попытке передать сочетание клавиш. Я точно знаю, что есть программы, способные на это, да и стандартная экранная клавиатура прекрасно справляется. Вот сообщения, которые шлет в WoT одна из таких программ:
Код:
<00004> 006310B4 S WM_DRAWCLIPBOARD
<00005> 006310B4 R WM_DRAWCLIPBOARD
<00006> 006310B4 S WM_DRAWCLIPBOARD
<00007> 006310B4 R WM_DRAWCLIPBOARD
<00008> 006310B4 P WM_KEYDOWN nVirtKey:VK_CONTROL cRepeat:1 ScanCode:1D fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<00009> 006310B4 P WM_KEYDOWN nVirtKey:'V' cRepeat:1 ScanCode:2F fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<00010> 006310B4 P WM_CHAR chCharCode:'22' (22) cRepeat:1 ScanCode:2F fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<00011> 006310B4 P WM_KEYUP nVirtKey:'V' cRepeat:1 ScanCode:2F fExtended:0 fAltDown:0 fRepeat:1 fUp:1
<00012> 006310B4 P WM_KEYUP nVirtKey:VK_CONTROL cRepeat:1 ScanCode:1D fExtended:0 fAltDown:0 fRepeat:1 fUp:1
<00013> 006310B4 S WM_DRAWCLIPBOARD
<00014> 006310B4 R WM_DRAWCLIPBOARD
<00015> 006310B4 S WM_DRAWCLIPBOARD
<00016> 006310B4 R WM_DRAWCLIPBOARD
Однако простое повторение отсылки этих сообщений не дает результата. Равно как и предложенный вами код. У меня получается вставлять текст вот такой процедурой:
Код:
procedure PasteMessage;
var
KeyInputs: array of TInput;
KeyInputCount: Integer;
procedure KeybdInput(VKey: Byte; Flags: DWORD);
begin
Inc(KeyInputCount);
SetLength(KeyInputs, KeyInputCount);
KeyInputs[KeyInputCount - 1].Itype := INPUT_KEYBOARD;
with KeyInputs[KeyInputCount - 1].ki do
begin
wVk := VKey;
wScan := MapVirtualKey(wVk, 0);
dwFlags := KEYEVENTF_SCANCODE;
dwFlags := Flags or dwFlags;
time := 0;
dwExtraInfo := 0;
end;
end;
begin
KeyInputCount := 0;
KeybdInput(VK_CONTROL, 0);
KeybdInput(Ord('V'), 0);
KeybdInput(Ord('V'), KEYEVENTF_KEYUP);
SendInput(KeyInputCount, KeyInputs[0], SizeOf(KeyInputs[0]));
Sleep(200);
KeyInputCount := 0;
KeybdInput(VK_CONTROL, KEYEVENTF_KEYUP);
SendInput(KeyInputCount, KeyInputs[0], SizeOf(KeyInputs[0]));
end;
Но, как я говорил - есть два "но":
1. Клавиша Ctrl используется как модификатор для вызова вставки.
2. На момент вставки текста Ctrl еще нажат.
Вот в избавлении от них я и прошу помощи.
P.S.: В остальных программах таких проблем нет.