在我的程序中尝试查看打开的活动窗口时收到一个问号

本文关键字:一个 窗口 活动 程序 我的 看打 | 更新日期: 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代码页中既不支持捷克字母也不支持阿拉伯字母。