如何使用PowerShell在Win32中使用带有Unicode的SetWindowText?

t30tvxxf  于 2023-04-21  发布在  Shell
关注(0)|答案(1)|浏览(132)

我正在尝试使用PowerShell更改窗口标题以显示表情符号。
我可以改变一个进程的窗口标题(有一个窗口)使用...

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

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

$MyNotepadProcess = start-process notepad -PassThru
[Win32]::SetWindowText($MyNotepadProcess.MainWindowHandle, 'My Title')

但是使用SetWindowText和emoji-codes只会混淆输出中的emoji字符。
使用SetWindowTextW会混淆我传递给函数的任何内容的输出...

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

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

$MyNotepadProcess = start-process notepad -PassThru
[Win32]::SetWindowTextW($MyNotepadProcess.MainWindowHandle, 'My Title')

一个问题,我认为我有,是SetWindowTextW只接受宽字符串,但我不知道如何提供作为输入。
然后我需要使用Unicode数字添加表情符号,如`u{1F 600}(即:)也是你)。
(See Get Started with Win32 and C++ - Working with Strings

bmp9r5qi

bmp9r5qi1#

确保正确调用WinAPI函数的Unicode版本的最简单方法是:

  • CharSet=CharSet.Unicode添加到[DllImport]属性。
    • 省略 * 函数名中的W后缀。
// Note the use of "CharSet=CharSet.Unicode" and 
// the function name *without suffix*
[DllImport("User32.dll", CharSet=CharSet.Unicode)]
public static extern int SetWindowText(IntPtr hWnd, string strTitle);

这确保了SetWindowTextW,即调用函数的 Unicode 实现,* 并且 *.NET将.NET字符串本质上作为原生LPCWSTR字符串进行封送,即作为Unicode代码单元的空终止数组。

相关问题