11

我正在将旧cmd命令转换为 Powershell,目前使用:

START "My Title" Path/To/ConsoleApp.exe

这可以按预期工作以启动 ConsoleApp,并将我的标题作为它的窗口标题。这已被替换为正常工作的 Start-Process,但不提供更改标题的机制。

有没有其他方法可以在不使用命令的情况下做到这一点cmd

4

4 回答 4

11

更改进程主窗口的文本时有一个小怪癖:如果您尝试在启动进程后立即更改文本,它可能会由于许多可能的原因之一而失败(例如,显示的控件的句柄该文本在函数调用时不存在)。因此解决方案是WaitForInputIdle()在尝试更改文本之前使用该方法:

Add-Type -TypeDefinition @"
using System;
using System.Runtime.InteropServices;

public static class Win32Api
{
    [DllImport("User32.dll", EntryPoint = "SetWindowText")]
    public static extern int SetWindowText(IntPtr hWnd, string text);
}
"@

$process = Start-Process -FilePath "notepad.exe" -PassThru
$process.WaitForInputIdle()
[Win32Api]::SetWindowText($process.MainWindowHandle, "My Custom Text")

请注意,在您进行自己的更改后,应用程序本身仍然可以更改窗口文本。

于 2010-07-01T09:57:14.093 回答
5

我用 cmd.exe 试过了,效果很好。

Add-Type -Type @"
using System;
using System.Runtime.InteropServices;
namespace WT {
   public class Temp {
      [DllImport("user32.dll")]
      public static extern bool SetWindowText(IntPtr hWnd, string lpString); 
   }
}
"@

$cmd = Start-Process cmd -PassThru
[wt.temp]::SetWindowText($cmd.MainWindowHandle, 'some text')
于 2010-07-01T06:26:36.040 回答
2

如果您想使用带有自定义标题的 powershell 生成一个进程,请尝试:

$StartInfo = new-object System.Diagnostics.ProcessStartInfo
$StartInfo.FileName = "$pshome\powershell.exe"
$StartInfo.Arguments = "-NoExit -Command `$Host.UI.RawUI.WindowTitle=`'Your Title Here`'"
[System.Diagnostics.Process]::Start($StartInfo)

请注意转义标题字符串的反引号字符,它们至关重要!

于 2016-11-24T16:06:34.130 回答
1

$host.UI.RawUI.WindowTitle = "新标题"

正如乔治已经说过的那样,任何/任何人都可以将其设置回来(例如自定义提示功能)。

于 2010-07-02T10:51:55.960 回答