Показать сообщение отдельно
  #3  
Старый 01.03.2014, 05:47
Enforcer Enforcer вне форума
Прохожий
 
Регистрация: 22.05.2012
Адрес: Санкт-Петербург
Сообщения: 4
Версия Delphi: Delphi 7, XE4
Репутация: 10
По умолчанию

Цитата:
Сообщение от 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.: В остальных программах таких проблем нет.
Ответить с цитированием