5

ここで使用されているSendInput を使用して+の組み合わせを送信することにより、システム全体のホットキーCtrl+ Shift+a key of the user's choiceを使用してクリップボードにテキストを貼り付けるプログラムがあります。これは、ほとんどのプログラムでうまく機能します。しかし、新しい電子メールの [宛先] フィールドの Outlook では、キーを押すたびに、 + +キーの組み合わせであるはずの [アイテムをフォルダーに移動] Outlook ダイアログ ボックスが表示されます。Body フィールドでは何も起こりません。ここで何が起こっているのですか?以下の再現するコードを参照してください。CtrlVCtrlShiftV

procedure TForm1.FormCreate(Sender: TObject);
begin
  If not RegisterHotkey( Handle, 1, MOD_SHIFT or  MOD_CONTROL, Ord('P') ) Then
    ShowMessage('Error');
end;

Procedure TForm1.WMHotkey( Var msg: TWMHotkey );
var
  KeyInputs: array of TInput;

  procedure KeybdInput(VKey: Byte; Flags: DWORD);
  begin
    SetLength(KeyInputs, Length(KeyInputs)+1);
    KeyInputs[high(KeyInputs)].Itype := INPUT_KEYBOARD;
    with  KeyInputs[high(KeyInputs)].ki do
    begin
      wVk := VKey;
      wScan := MapVirtualKey(wVk, 0);
      dwFlags := Flags;
    end;
  end;

Begin
  If (msg.HotKey > 0) And (msg.HotKey < 2) Then
  Begin
    Clipboard.AsText:= 'Some text';
    KeybdInput(VK_CONTROL, 0);                // Ctrl
    KeybdInput(Ord('V'), 0);
    KeybdInput(Ord('V'), KEYEVENTF_KEYUP);
    KeybdInput(VK_CONTROL, KEYEVENTF_KEYUP); // Ctrl
    SendInput(Length(KeyInputs), KeyInputs[0], SizeOf(KeyInputs[0]));
  end
End;
4

2 に答える 2

3

SendInput は、キーボードの現在の状態をリセットしません。したがって、Outlook はホットキーのCtrl+を認識します。Shiftキーの解放をシミュレートする必要がありShiftます。

したがって、次のようにすると、Outlook で動作します。

var
  input: TInput;
begin
  // This releases the shift Key:
  input.Itype := INPUT_KEYBOARD;
  input.ki.wVk := VK_SHIFT;
  input.ki.wScan := 0;
  input.ki.dwFlags := KEYEVENTF_KEYUP;
  input.ki.time := 0;
  input.ki.dwExtraInfo := 0;
  SendInput(1, input, sizeof(input));

  // Send 'V'
  input.Itype := INPUT_KEYBOARD;
  input.ki.wVk := Ord('V');
  input.ki.wScan := Ord('V');
  input.ki.dwFlags := 0;
  input.ki.time := 0;
  input.ki.dwExtraInfo := 0;
  SendInput(1, input, sizeof(input));
  input.ki.dwFlags := KEYEVENTF_KEYUP;
  SendInput(1, input, sizeof(input));
end;
于 2014-05-25T18:08:31.417 に答える
0

Outlook はそのようなキー ストロークを使用します。唯一の回避策は、キーボード フック (SetWindowsHookEx(WH_GETMESSAGE, ...)) をインストールすることです。フック プロシージャでは、FindControl() を使用して Delphi コントロールを見つけることができます。次に、メッセージをそのコントロールに渡し、メッセージを WM_NULL にリセットするか、Outlook に渡すかを決定できます。

Outlook オブジェクト モデルを使用してテキストを変更してみませんか? Inspector.GetWordEditor は Word の Document オブジェクトを返します。

于 2014-05-24T22:22:19.137 に答える