2013-09-16 4 views
1

Я пытаюсь автоматизировать процесс, и для этого требуется управление некоторыми не-Delphi-окнами. В частности, я хотел бы, чтобы кнопка просто переключила фокус на другое приложение, фактически нажмите F11 и вернитесь в Delphi. Другая программа неясна, поэтому самым простым было бы эмулировать «alt + tab» для переключения фокуса. Я пробовал многие из опубликованных примеров, но они не дали результатов.Переключение на другую задачу

+3

Начните с прочтения этого: http://msdn.microsoft.com/en-us/library/windows/desktop/ms633539.aspx Я оставил тег Delphi в вопросе , но на самом деле этот вопрос не имеет ничего общего с Delphi. Это чистый вопрос Win32. –

+3

Как указано в ссылке, опубликованной Дэвидом, вы не сможете вернуться в свое приложение. После активации этого другого приложения вы сыграли свою последнюю карточку. Вы должны попытаться решить это по-другому. Начните с изучения того, предоставляет ли другое приложение интерфейс автоматизации. – IInspectable

+0

В чем вопрос? –

ответ

-1

Ну, вы можете использовать EnumChildWindows() из формы, чтобы получить HWND окна, которое вы хотите щелкнуть или набрать что-то или что-нибудь, и использовать SendMessage на нем с сообщением WM_SYSKEYDOWN (если вы используете функциональные клавиши, if не используйте WM_CHAR или WM_KEYDOWN), что, вероятно, приведет к нажатию виртуальной клавиши в окне без необходимости фокусироваться на ней, если вы хотите также сфокусироваться, используйте сообщение WM_SETFOCUS

0

Вы можете сделать точно так, как вы предлагаете: эмулировать «alt + tab» для переключения фокуса, фактически нажмите F11, вернитесь в свою программу. SendInput может размещать события клавиатуры в потоке ввода с клавиатуры. Обязательно прочитайте документацию, хотя для условий, когда она не срабатывает, например, UIPI, существующее состояние клавиатуры и т. Д.

Ниже приведено тестирование, чтобы сделать фоновое окно проводника интернета полноэкранным, а затем вернуть фокус в приложение. Рефакторинг его, как вам нравится:

var 
    Inputs: array[0..1] of TInput; 
begin 
    ZeroMemory(@Inputs, SizeOf(Inputs)); 

    // alt+tab down 
    Inputs[0].Itype := INPUT_KEYBOARD; 
    Inputs[0].ki.wVk := VK_MENU; 
    Inputs[1].Itype := INPUT_KEYBOARD; 
    Inputs[1].ki.wVk := VK_TAB; 
    SendInput(2, Inputs[0], SizeOf(Inputs[0])); 

    // wait for the task switch dialog 
    Sleep(100); 

    // alt+tab up 
    Inputs[0].Itype := INPUT_KEYBOARD; 
    Inputs[0].ki.wVk := VK_TAB; 
    Inputs[0].ki.dwFlags := KEYEVENTF_KEYUP; 
    Inputs[1].Itype := INPUT_KEYBOARD; 
    Inputs[1].ki.wVk := VK_MENU; 
    Inputs[1].ki.dwFlags := KEYEVENTF_KEYUP; 
    SendInput(2, Inputs[0], SizeOf(Inputs[0])); 

    // so that we can deactivate 
    Application.ProcessMessages; 

    // press F11 
    Inputs[0].Itype := INPUT_KEYBOARD; 
    Inputs[0].ki.wVk := VK_F11; 
    Inputs[0].ki.dwFlags := 0; 
    SendInput(1, Inputs[0], SizeOf(Inputs[0])); 

    // F11 up 
    Inputs[0].Itype := INPUT_KEYBOARD; 
    Inputs[0].ki.wVk := VK_F11; 
    Inputs[0].ki.dwFlags := KEYEVENTF_KEYUP; 
    SendInput(1, Inputs[0], SizeOf(Inputs[0])); 

    // give chance to the application to go fullscreen 
    Sleep(100); 

    // alt+tab down again 
    Inputs[0].Itype := INPUT_KEYBOARD; 
    Inputs[0].ki.wVk := VK_MENU; 
    Inputs[0].ki.dwFlags := 0; 
    Inputs[1].Itype := INPUT_KEYBOARD; 
    Inputs[1].ki.wVk := VK_TAB; 
    Inputs[1].ki.dwFlags := 0; 
    SendInput(2, Inputs[0], SizeOf(Inputs[0])); 

    // wait for alt+tab dialog 
    Sleep(100); 

    //alt+tab up 
    Inputs[0].Itype := INPUT_KEYBOARD; 
    Inputs[0].ki.wVk := VK_TAB; 
    Inputs[0].ki.dwFlags := KEYEVENTF_KEYUP; 
    Inputs[1].Itype := INPUT_KEYBOARD; 
    Inputs[1].ki.wVk := VK_MENU; 
    Inputs[1].ki.dwFlags := KEYEVENTF_KEYUP; 
    SendInput(2, Inputs[0], SizeOf(Inputs[0])); 
end; 
Смежные вопросы