通过PowerShell更改另一个窗口的标题

ryevplcw  于 2023-03-08  发布在  Shell
关注(0)|答案(1)|浏览(272)

我有一个VB应用程序,它启动了一个第三方非GUI应用程序的多个示例。为了跟踪这些示例,我使用SetWindowText()函数更新了它们的标题。然而,这个应用程序有一个不好的习惯,那就是不断更新标题,所以每个SetWindowText都只是暂时的。只要你点击屏幕上的任何地方,磁贴改回来了。我找到了一种通过PowerShell更新标题的方法,使用以下代码:

$titletext = "My Title"
# Start a thread job to change the window title to $titletext
$null = Start-ThreadJob { param( $rawUI, $windowTitle )
Start-Sleep -s 2
if ( $rawUI.WindowTitle -ne $windowTitle ) {
    $rawUI.WindowTitle = $windowTitle
}
}-ArgumentList $host.ui.RawUI, $titletext
& 'c:\Program Files\Application\Application.exe' '-id=userid -pass=password'

这工作得很完美,标题的更改 * 是 * 永久的,所以正是我想要的。唯一的问题是 * 所有内容 * 都被记录在Windows PowerShell日志中,包括参数-id=和-pass=。一个解决方案是如果我可以通过我的VB应用程序启动applicationiderexe,并通过PowerShell脚本进行重命名,但我不知道是否可以通过ThreadJob来实现。是否可以启动一个ThreadJob并重命名另一个窗口,也许可以通过它的句柄?

w8rqjzmb

w8rqjzmb1#

  • 从 * inside * 控制台更改控制台标题是您的最佳选择,这就是PowerShell代码所做的。
  • 虽然可以调用SetWindowText() API函数来设置 * 另一个进程的 * 控制台窗口标题,但无法保证此 * 更改始终有效 *,因为与此类窗口的任何后续 * 交互 * 都会导致恢复 * 原始 * 窗口标题(此行为似乎内置于conhost.exe中,conhost.exe是Windows上常规控制台窗口的基础控制台主机)。
  • 相比之下,设置与 * 当前进程 * 关联的控制台窗口的标题 * 将 * 保持有效(除非稍后再次覆盖),这是SetConsoleWindow() WinAPI函数所做的事情(基于shell和API的机制,如cmd.exe中的title和PowerShell中的[Console]::Title/$hostUI.RawUI.WindowTitle,可能最终会调用)。
  • 因此,坚持使用PowerShell方法,并借助环境变量避免密码记录问题,如下所述。
  • Windows PowerShell的脚本块日志记录(参见about_Logging)记录正在创建的代码的 * 源代码 *。
  • 如果您不提供 * literal * 参数,而是通过在PowerShell * 外部设置的 * 变量**间接 * 提供参数,则可以避免记录参数 * 值 *。
  • 因此:
  • 让您的VB.NET应用程序(临时)设置一个包含密码的 * 环境变量 *。(也许不用说,最好避免存储和传递 * 纯文本 * 密码)。
  • 在PowerShell脚本中,引用该环境变量,而不是传递一个 * literal * 密码-这样,实际密码将 * 不会 * 显示在日志中。

例如,假设您的VB. NET应用程序在启动PowerShell脚本之前创建了包含密码的环境变量MYPWD

$titletext = "My Title"

# Start a thread job to change the window title to $titletext
$null = Start-ThreadJob { param( $rawUI, $windowTitle )
  Start-Sleep -s 2
  if ( $rawUI.WindowTitle -ne $windowTitle ) {
    $rawUI.WindowTitle = $windowTitle
  }
} -ArgumentList $host.ui.RawUI, $titletext

# Note: 
# * Assumes that your VB.NET application has set env. var. "MYPWD".
# * The arguments must be passed *individually*, not inside a single string.
& 'c:\Program Files\Application\Application.exe' -id=userid "-pass=$env:MYPWD"

相关问题