0

Win32 :: GUItestを使用してWindowsのコマンドプロンプトウィンドウにキーストロークを送信するperlスクリプトを作成しました。スクリプトを実行すると、perlのシステム関数が使用され、新しいcmd.exeファイルが開かれ、キーストロークが送信されます。ここまではすべて正常に機能しますが、コマンドプロンプトウィンドウが表示され、ユーザーが手動でスクリプトを実行することは望ましくありません。キーストロークをバックグラウンドでcmd.exeウィンドウに送信したい。Windows64ビットサーバーを使用してschtasksを使用してスクリプトをスケジュールしたい。

を使用するように私に提案しないでください。実際にこのタスクを実際に試した場合を除きProc::Background、それらを使用して問題なく動作します。Win32::ServiceWin32::Daemon

4

2 に答える 2

0

でコンソールを制御できると思いますWin32::Console

私はそれを経験していませんが、ドキュメントは有望に聞こえDisplay()ます.関数があるので、コンソールはデフォルトで非表示になっていると思います.

于 2012-07-05T18:33:20.163 に答える
0

ウィンドウがアクティブでフォアグラウンドにあることに依存するのではなく、問題のウィンドウにWM_CHARまたはWM_UNICHARメッセージを送信する必要があります。

この例は私にとってはうまくいくようです。ウィンドウlinksで実行中のキーが送信されている間に、他のアプリケーションに切り替えることができました。cmd.exeメールの入力が完了するまでに、リンクは に移動していましたexample.com

#!/usr/bin/env perl

use strict; use warnings;
use Encode qw(encode);
use Time::HiRes qw( usleep );
use Win32::GuiTest qw(SendMessage ShowWindow WaitWindow);

use constant WM_CHAR => 0x0102;
use constant SW_HIDE => 0;
use constant SW_SHOW => 5;

system qw(start links);

my $hwnd = WaitWindow('Links', 5);

ShowWindow $hwnd, SW_HIDE;

send_message($hwnd, "ghttp://example.com/\r");

ShowWindow $hwnd, SW_SHOW;

send_message($hwnd, "q\r", 3_000_000);

sub send_message {
    my ($hwnd, $msg, $delay) = @_;

    $delay ||= 25_000;
    my @keys = encode_keys($msg);

    for my $key (@keys) {
        SendMessage $hwnd, WM_CHAR, $key, 0;
        usleep $delay;
    }
    return;
}

sub encode_keys {
    my ($msg) = @_;
    map ord, map encode('UTF16-LE', $_), split //, $msg;
}
于 2012-07-06T22:51:05.273 に答える