【问题标题】:Why can I drive InstallShield with Win32::GuiTest on XP but not Windows 7?为什么我可以在 XP 上使用 Win32::GuiTest 而不是 Windows 7 来驱动 InstallShield?
【发布时间】:2011-04-18 10:58:24
【问题描述】:

我正在尝试使用 Win32::GuiTest 来测试基于 InstallShield 的卸载过程。我可以打开控制面板,找到应用程序,然后调用 InstallShield,但我所做的似乎没有让我在安装程序中选择“删除”按钮。到目前为止,我有:

sub uninstall($;$) {
    my ($name, $force) = @_;
    if (! defined($force)) {
        $force=0;
    }

    my @windows;
    # Control Panel window
    my $cpwin;
    my $w;
    my $text;
    # Install Shield window
    my $iswin;

    # Run the Control Panel (In windir, do `control appwiz.cpl`)
    system("cd %windir% && control appwiz.cpl");
    sleep 1;
    print("Opened control panel\n");

    # Get the Window ID of the control panel
    # FIXME - this label is system specifie (W7)
    @windows = FindWindowLike(undef, "Programs and Features", "");
    $cpwin = $windows[0];
    printf("Found CP window ID %x\n", $cpwin);

    # Get the Folder View window of the control panel
    # Find the list of applications
    @windows = FindWindowLike($cpwin, "FolderView");
    $w = $windows[0];

    # Find program in the list
    if (Win32::GuiTest::SelListViewItemText($w, $name) == 0) {
        printf("Could not find '$name'.\n");
        return -1;
    }

    # Invoke the installer for by pressing [Return]
    Win32::GuiTest::SendKeys("~");
    # Wait for the "initializing the wizard" window
    @windows = Win32::GuiTest::WaitWindow("InstallShield Wizard", 5);
    # Wait for the real installer window
    sleep 10;
    @windows = Win32::GuiTest::WaitWindow("InstallShield Wizard", 3);
    $iswin = $windows[0];
#    Win32::GuiTest::WaitWindow("Remove");
    printf("Found IS window ID %x\n", $iswin);
#    Win32::GuiTest::SetFocus($iswin);

    @windows = FindWindowLike($iswin, "&Remove", "Button");
    my $remove = $windows[0];
    printf("Found remove button  %x\n", $remove);
    Win32::GuiTest::PushButton($remove);
#    Win32::GuiTest::SetFocus($remove);
#    Win32::GuiTest::SendKeys("%r");
#    Win32::GuiTest::MouseClick("Remove",$iswin);
#    Win32::GuiTest::CheckButton($remove);
#    Win32::GuiTest::SendKeys("{DOWN}{DOWN}");

#    Win32::GuiTest::MouseClick("Next",$iswin);
#    Win32::GuiTest::PushChildButton($iswin, "Cancel");

我尝试过的所有方法(最后注释掉)似乎都没有任何效果。

如果有任何问题,我在 Windows 7 上使用 ActivePerl 和 Win32::GuiTest。

(请客气。我的 Perl 可能很烂。我有超过 25 年的编程经验,但在 Perl 上不到一个月。)

【问题讨论】:

标签: perl windows-7 installshield


【解决方案1】:

我试图驱动安装程序的事实似乎是一个红鲱鱼。在 XP 上(甚至在虚拟机中),这可以正常工作。我怀疑问题在于安装程序显示对话框,而记事本显示一个窗口,并且这些在 W7 中的处理方式与 XP 不同。我会回到为什么 W7 不起作用,但 XP 是我现在必须做的,这就足够了。

【讨论】:

    【解决方案2】:

    Win32::GuiTest::PushButton 方法将按钮文本或 ID 作为参数,而不是窗口/控件对象。所以你根本不需要调用FindwindowLike 方法。

    Win32::GuiTest::PushButton 仅从前台窗口查找按钮,这可能不适用于所有情况。应该使用Win32::GuiTest::PushChildButton

    请试试这个方法:

    #@windows = FindWindowLike($iswin, "&Remove", "Button");
    #my $remove = $windows[0];
    #printf("Found remove button  %x\n", $remove);
    sleep 10;
    Win32::GuiTest::PushChildButton($iswin, "&Remove", 50);
    

    【讨论】:

    • 在按钮之前sleep 10怎么样?
    猜你喜欢
    • 1970-01-01
    • 2011-04-18
    • 1970-01-01
    • 2017-05-01
    • 1970-01-01
    • 2011-11-07
    • 1970-01-01
    • 2019-05-25
    • 2011-04-06
    相关资源
    最近更新 更多