delphi - 为什么 SendInput Ctrl+V 在 Outlook 中不起作用?

标签 delphi outlook delphi-xe hotkeys sendinput

我有一个程序,它使用系统范围的热键Ctrl+Shift+用户选择的键将文本粘贴到剪贴板中通过使用使用的 SendInput 发送 Ctrl+V 组合 here 。这在大多数程序中都可以正常工作。但在 Outlook 中新电子邮件的“收件人”字段中,我尝试的每个键最终都会弹出“将项目移至文件夹”Outlook 对话框,该对话框应该是 Ctrl+Shift+V 组合键。在 body 领域什么也没有发生。你知道这里发生了什么吗?请参阅下面的重现代码:

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;

最佳答案

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;

关于delphi - 为什么 SendInput Ctrl+V 在 Outlook 中不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23850012/

相关文章:

delphi - 在Delphi的TImage控件上绘制Sphere

Delphi:我应该使用重载,重新引入+重载还是不使用?

c# - 将 'MailItem' 对象另存为 .msg 文件

delphi - 加密组件

delphi - 解码错误

java - delphi加密转换Java代码

具有自定义实时域的 PHP 邮件程序(hotmail/outlook)

c# - 如何从 Word 编辑器对象(在 Outlook 2010 中)获取所选文本并将其复制到另一个表单?

delphi - 如何从动态生成的表单中检索数据?

delphi - 使用 poPropagateChanges 和 poFetchDetailsOnDemand 避免 ClientDataSets 中的内存损坏?