如何使用perl隐藏和发送击键到命令提示符窗口?

时间:2012-07-05 18:06:49

标签: windows perl background

我使用Win32 :: GUItest编写了一个perl脚本,将键击发送到windows中的命令提示符窗口,现在当我的脚本运行时,它使用perl中的系统函数并打开一个新的cmd.exe文件并发送键击它。一切正常,直到这里,但我不希望该命令提示窗口可见,用户手动运行脚本。我希望将键击发送到后台的cmd.exe窗口。我想使用Windows 64位服务器使用schtasks安排脚本。

请不要建议我使用Proc::BackgroundWin32::ServiceWin32::Daemon,除非你真的尝试过这项任务,因为你可以使用它们。

2 个答案:

答案 0 :(得分:0)

我认为您可以使用Win32::Console来控制控制台。

我没有使用它的经验,但文档听起来很有希望:因为有一个Display()函数,我假设控制台默认是隐藏的。

答案 1 :(得分:0)

您需要向相关窗口发送WM_CHARWM_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;
}
相关问题