Как активировать какое-то окно из внешнего приложения в Windows?

Я хочу отправить какое-то нажатие клавиши во внешнее приложение, и оно работает нормально, но когда я пытаюсь отправить нажатие клавиши в дочернее окно того же внешнего приложения, по какой-то причине это не работает, поэтому мне нужна помощь. Допустим, мы хотим распечатать текст буфера обмена из блокнота и хотим сделать это за один шаг. В коде, который будет выглядеть так.

        #include <windows.h>
    #include <stdio.h>
    #include <iostream.h>
    using namespace std;

    int main(int argc, char* argv[]){
        WinExec("notepad", 1);
        Sleep(1000);
        HWND handle = FindWindow("notepad",0);  // it's handling as well
        SetForegroundWindow(handle);        
        keybd_event(VK_CONTROL, 0, 0, 0);   // simulate CTRL down
        keybd_event(VkKeyScan('V'), 0, 0, 0);
        keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0); 
        Sleep(500);
        keybd_event(VK_CONTROL, 0, 0, 0);   // simulate CTRL down
        keybd_event(VkKeyScan('P'), 0, 0, 0);
        keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0); // simulate CTRL up
        Sleep(1000);
        HWND handle1 = FindWindow(0, "Print");  // it wann't find "Print" window
        SetForegroundWindow(handle1);
        keybd_event(VK_MENU, 0, 0, 0); // simulate ALT down
        keybd_event(VkKeyScan('P'), 0, 0, 0);
        keybd_event(VK_MENU, 0, KEYEVENTF_KEYUP, 0);
        return 0;
    }

Но он хочет отправить ALT + P в окно «Печать», почему? Конечная цель - сделать небольшой макрос, который отправляет ключи приложений (на любой дочерний или родительский Windows..) ОС: WIN 7 64bit


person Ivan Pericic    schedule 27.11.2011    source источник
comment
целевое приложение - блокнот (если я тоже понимаю)   -  person Ivan Pericic    schedule 27.11.2011
comment
да, но вопрос в том, как активировать окно печати, которое не является главным окном во внешнем приложении (я не могу найти способ их активировать), хочу сделать это из c/С++   -  person Ivan Pericic    schedule 27.11.2011
comment
Извините, я немного медленно соображаю. Если все, что вы хотите сделать, это распечатать текстовый файл, отправьте команду print в ShellExecute, передав имя текстового файла в качестве имени файла. У меня такое ощущение, что если бы вы сказали нам свою общую цель, было бы довольно тривиальное решение. Подделка ввода действительно должна быть последним средством.   -  person David Heffernan    schedule 27.11.2011
comment
Нет, я не хочу узнать, как выбрать любое окно, это просто простой пример, я хочу выбрать многие из них, ... хочу сделать что-то вроде щелчка макроса ...   -  person Ivan Pericic    schedule 27.11.2011


Ответы (1)


Вероятно, вы можете заставить существующий код (вроде) работать, просто удалив эти строки:

HWND handle1 = FindWindow(0, "Print");  // it wann't find "Print" window
SetForegroundWindow(handle1);

Помните, что фальшивый ввод идет в поток, который имеет фокус ввода, и когда вы показываете диалоговое окно печати в Блокноте, это диалоговое окно получает фокус ввода. Вам просто не нужно устанавливать фокус, система сделает это за вас.

Однако выбранный вами подход невероятно хрупок. Я подозреваю, что вам будет гораздо лучше использовать что-то вроде автоматизации пользовательского интерфейса. .

person David Heffernan    schedule 27.11.2011