2014-05-24 9 views
4

나는 + 이 SendInput을을 사용하여 V 조합 here을 사용으로 Ctrl 키를 전송하여 클립 보드의 텍스트를 붙여 시스템 전체 단축키를 Ctrl 키 + 시프트 + 사용자의 선택의 키를 사용하는 프로그램을 가지고 . 이것은 대부분의 프로그램에서 잘 작동합니다. 그러나 새로운 전자 메일의받는 사람 필드에있는 Outlook에서 "Press Item To Folder"Outlook 대화 상자가 나타나는데 이는 Ctrl + 입니다. Shift + V 키 조합입니다. 본문 필드에서는 아무 것도 발생하지 않습니다. 어떤 아이디어가 여기에서 발생하고 있습니까? 아래에서 재현 할 코드를 참조하십시오.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

. 방금이 SendInput 기술이 Outlook에서 작동하지 않는 것으로 나타났습니다. –

+0

사용하는 것이 더 쉬울 수 있습니다 – user3640611

+0

좋은 SSCCE를 추가하면 누군가가 도움이 될 가능성이 더 높다고 생각합니다. 내 부분에 아무런 노력을 기울이지 않으면 더 도울 수있을 것입니다. 그것이 의미하는대로 나는 repro을 만들기 위해 나의 시간을 투자해야한다. 실제로 모든 잠재적 인 도우미는 그렇게해야합니다. 아마 그 단계는 퍼팅에서 충분히 벗어 났을 것입니다. –

답변

2

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; 
내 소프트웨어는 자동화가 실용적이지 않을 것이다, 그래서 텍스트 붙여 넣기를 할 수있는 프로그램을 작동하기위한 것입니다 자동화
+0

예 추가 KeybdInput (VK_SHIFT, KEYEVENTF_KEYUP); 트릭을 수행합니다. Sebastian에게 감사드립니다! – user3640611

0

Outlook에서 이와 같은 키 스트로크를 처리합니다. 유일한 해결 방법은 키보드 후크 (SetWindowsHookEx (WH_GETMESSAGE, ...))를 설치하는 것입니다. 후크 proc에서 FindControl()을 사용하여 Delphi 컨트롤을 찾을 수 있습니다. 그런 다음 해당 컨트롤에 메시지를 전달할지 여부를 결정하고 메시지를 WM_NULL로 다시 설정하거나 Outlook으로 전달할 수 있습니다.

왜 Outlook 개체 모델을 사용하여 텍스트를 수정하지 않습니까? Inspector.GetWordEditor는 Word의 Document 객체를 반환합니다.

+0

키 스트로크를 먹는 것 같지 않습니다. SendInput으로 Ctrl + V를 보낼 때 Shift 키를 누르는 것 같습니다. 그래서 대신 Ctrl + Shift + V를 얻습니다. 글로벌 후크보다 쉬운 방법이 있었으면 좋겠지 만 시도해 보겠습니다. 감사. – user3640611

+0

Outlook은 어떻게합니까? 위조 된 입력 이벤트와 실제 입력 이벤트의 차이점을 어떻게 알 수 있습니까? 그리고 온 스크린 키보드는 어떻게 작동합니까? –