2014-05-24 34 views
4

我有一个使用系统宽热键Ctrl键 + + 用户的选择的键通过发送Ctrl键 + 所用here V使用SendInput组合到剪贴板中的文本粘贴的程序。这在大多数程序中工作正常。但是,在新邮件的To字段的Outlook中,我尝试的每个密钥最终都会显示“Move Item To Folder”Outlook对话框,该对话框应该是Ctrl + Shift + V组合键。在Body字段中没有任何反应。有什么想法发生在这里?看代码重现如下:为什么SendInput Ctrl + V在Outlook中不起作用?

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; 
+0

这可能是更容易使用自动化 –

+0

我的软件是指具有任何程序,允许文本的粘贴这样的自动化将是不实际工作。我只注意到这个SendInput技术在Outlook中不起作用。 – user3640611

+0

我认为如果你添加了一个好的SSCCE,更有可能有人会提供帮助。如果我能够不费吹灰之力,那么我会更倾向于提供帮助。就目前而言,我必须投入时间来制作报刊。确实,每个潜在的帮手都需要这样做。也许这一步已经足够了。 –

回答

2

SendInput不会重置键盘的当前状态。所以Outlook看到了Ctrl + Shift你的热键。你必须模拟释放Shift键。

所以,如果我这样做,它工作在展望:

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; 
+0

是加入 KeybdInput(VK_SHIFT,KEYEVENTF_KEYUP); 有窍门。感谢塞巴斯蒂安! – user3640611

0

Outlook吃这样的关键笔画。唯一的解决方法是安装键盘钩子(SetWindowsHookEx(WH_GETMESSAGE,...))。在你的钩子过程中,你可以使用FindControl()来查找Delphi控件。然后,您可以决定是否将消息传递给该控件,并将该消息重置为WM_NULL或让它传递给Outlook。

为什么不使用Outlook对象模型来修改文本? Inspector.GetWordEditor返回Word的文档对象。

+0

它似乎没有吃中风。当我用SendInput发送Ctrl + V时,似乎正在添加Shift键按下。所以它取而代之的是Ctrl + Shift + V。 希望有一个比全局钩子更容易的方法,但我会尝试它。谢谢。 – user3640611

+0

Outlook如何做到这一点?它如何能够分辨伪装输入事件与真实输入事件之间的区别?屏幕键盘如何工作? –

相关问题