专注于批量启动的应用程序

9
我正在运行一系列应用程序,使用批处理脚本,我希望确保打开的程序始终处于焦点状态。这是因为它是一个实验性设置,我们希望尽量减少这样的麻烦,例如需要更改焦点到全屏窗口。
这个问题在早期程序退出时已经偶尔发生过了。当桌面可见并且用户单击桌面上的某个图标时,接下来正在处理的下一个程序新窗口将不会处于焦点状态。
现在我隐藏了命令窗口后,这个问题变得更加频繁了。
有没有办法强制使下一个程序在序列中成为焦点,无论是批处理命令、操作系统的一些设置(我们使用Win XP)还是辅助应用程序?

你解决了这个问题吗?最近我也遇到了类似的问题,如果有帮助那就太感激了。谢谢。 - aj8080
3个回答

3

如果你想将焦点转移到另一个程序上,可以这样做。

call focus WindowTitle
exit /b

:focus
setlocal EnableDelayedExpansion 

    if ["%~1"] equ [""] (
        echo Please give the window's title.
        exit /b
    )

    set pr=%~1
    set pr=!pr:"=!

    echo CreateObject("wscript.shell").appactivate "!pr!" > "%tmp%\focus.vbs"
    call "%tmp%\focus.vbs"
    del "%tmp%\focus.vbs"

goto :eof 
endlocal 

我正在使用VBScript来聚焦应用程序。 你需要传递窗口的标题,而不是窗口的名称(whatever.bat)。 为了确保你聚焦到正确的窗口,你可以设置它的标题。 示例:

title WindowTitle

1

Yaron 的答案可以使用,但是我更喜欢不创建临时文件来执行脚本,而是将代码直接嵌入批处理文件中。或者使用 jscript,它也是 Windows 脚本主机的一部分,并且更容易嵌入到批处理文件中。这里有一个 focusOn.bat输入链接描述,它将根据标题的起始字符串设置应用程序的焦点(不会创建临时文件,因此速度会稍微快一些):

@if (@X)==(@Y) @end /* JScript comment
    @echo off
    cscript //E:JScript //nologo "%~f0"  %*
    exit /b %errorlevel%
@if (@X)==(@Y) @end JScript comment */

var ARGS=WScript.Arguments;

if (ARGS.Length < 1 ) {
     WScript.Echo("No window title passed");
     WScript.Quit(1);
}

var sh=new ActiveXObject("WScript.Shell");
if(!sh.AppActivate(ARGS.Item(0))){
    WScript.Echo("Cannot find an app with window name starting with: " + ARGS.Item(0));
}

使用示例:

call focusOn.bat Untitled

应该将焦点放在记事本上(如果它的标题仍然是“未命名 - 记事本”)。


1

如果我理解正确的话,start /f yourapp.exe命令将会以前台模式启动应用程序。


1
它说“/f”是一个未知的参数。我尝试了start /MAX /WAIT "" "my.exe",但它和my.exe有相同的行为。也许我需要一个辅助应用程序来解决这个问题? - Milla Well
1
@MillaWell:你可能需要这样做。Windows基于最近的用户操作来控制焦点,并似乎没有公开强制将焦点转移到用户的功能。然而,这个功能对程序员是可用的,所以也许有人已经编写了一个专门用于将任意窗口/程序聚焦的辅助应用程序。 - Andriy M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接