Как я могу обработать диалоговое окно, вызванное программой, которую я запускаю из Perl? - PullRequest
3 голосов
/ 26 сентября 2010

У меня есть Perl-скрипт, который вызывает другое приложение, которое я не контролирую. Я использую system() для вызова этого приложения. Иногда это приложение генерирует необработанное исключение и выводит диалоговое окно исключения, которое необходимо обработать. Поскольку это необслуживаемый сценарий Perl, я хотел бы обнаружить эту ситуацию, обработать ее в сценарии Perl и продолжить. Мой поиск решений не был плодотворным. Поскольку system() генерирует дочерний процесс, стандартные механизмы обработки исключений в Perl не применяются. Я работаю на Windows XP. Есть предложения?

Ответы [ 2 ]

2 голосов
/ 27 сентября 2010

Найдите диалоговое окно и убейте его.Например, если вы хотите автоматически убить окно с заголовком «Калькулятор», следующий скрипт должен работать.

use strict;
use warnings;
use Win32::GUI();

use constant WM_CLOSE => 16;


sub kill {
    my $handle = Win32::GUI::FindWindow('', 'Calculator');
    Win32::GUI::SendMessage($handle, WM_CLOSE, 0, 0); 
}

while(1){
    &kill;
    sleep(5);
}
2 голосов
/ 27 сентября 2010

Возможно, сообщение Perlmonks Win32 :: OLE: как вызывать макросы Excel VBA и перехватывать все ошибки VBA без появления диалоговых окон? может помочь.

Практически каждый раз, когда вам нужно взаимодействовать с системными вещами Windows, вы в конечном итоге будете использовать Windows API (есть ли официальное название для этого?) Через Win32 :: OLE .

...