在我的程序中尝试查看打开的活动窗口时收到一个问号
本文关键字:一个 窗口 活动 程序 我的 看打 | 更新日期: 2023-09-27 18:11:20
我构建了一个软件,可以抓取重量并将光标放入打开的窗口中。一切都很顺利,只有一个问题让我烦恼当我打开Word时,收到一个问号(?)。然后软件挂起不能正确识别窗口
当我打开Word -我看到Word?—123.docx为例。即使我去掉了问号,这个软件还是卡在这里。
我代码: [DllImport("user32.dll")]
static extern IntPtr GetForegroundWindow();
[DllImport("user32.dll")]
static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count);
private string GetActiveWindowTitle()
{
const int nChars = 256;
StringBuilder Buff = new StringBuilder(nChars);
IntPtr handle = GetForegroundWindow();
if (GetWindowText(handle, Buff, nChars) > 0)
{
return Buff.ToString();
}
return null;
}
[DllImport("user32.dll")]
private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("user32.dll")]
private static extern bool SetForegroundWindow(IntPtr hWnd);
public void Start(string NAME)
{
MSG = lblMSG.Text.Trim();
IntPtr zero = IntPtr.Zero;
for (int i = 0; (i < 60) && (zero == IntPtr.Zero); i++)
{
Thread.Sleep(500);
zero = FindWindow(null, NAME);
}
if (zero != IntPtr.Zero)
{
.
.
.
}
}
有什么问题吗?如何解决?
谢谢
默认情况下,字符串和StringBuilder
在Windows上被封送为Unicode,因此这不是问题。然而,您正在调用GetWindowText
方法的ANSI版本(与FindWindow
相同)-这根本不起作用。Windows试图将它所能做的一切从unicode转换为ANSI,但它不能对当前ANSI代码页以外的字符做任何事情。
您需要使用CharSet.Auto
:
[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count);
这将在unicode系统上使用GetWindowText
(GetWindowTextW
)的unicode版本,而在非unicode系统上使用ANSI版本。
CharSet.Auto
,我的Word生成
??? ?? عربي ,عربى [Compatibility Mode] - Microsoft Word
,
ščř řč عربي ,عربى [Compatibility Mode] - Microsoft Word
我的系统语言环境当前设置为阿拉伯语,因此阿拉伯语即使使用ANSI GetWindowText
也可以正常工作-如果我更改回捷克语,ščř řč
在ANSI中也可以正常工作,而阿拉伯字母将被问号替换。更改为英语将用问号替换中的所有,因为英语ANSI代码页中既不支持捷克字母也不支持阿拉伯字母。