SetForegroundWindow不工作,如何检查Class / Caption名称

时间:2014-08-30 15:58:07

标签: c# winforms bringtofront

我有一个在后台运行的程序,当出现某个消息框时,我想拥有它,所以单击是将切换到指定的程序。

我只是找不到ClassName和CaptionName使用它,我需要它与魔兽世界一起工作。

窗口标题是任务管理器上的“魔兽世界”,它被称为“魔兽世界零售”,当我检查它的“属性它说”哇-64“属性时,在属性上它说的产品名称是”魔兽世界“所以我尝试了这些的所有组合,没有任何作用。如果我放下代码,则代码有效:
                BringToFront(“记事本”,“无标题 - 记事本”);

所以它有效,我只是不知道我需要什么来申请魔兽世界。

我的代码是:

    [DllImport("User32.dll")]
    public static extern Int32 SetForegroundWindow(int hWnd);
    [DllImport("user32.dll")]
    public static extern int FindWindow(string lpClassName, string lpWindowName);

    private void BringToFront(string className, string CaptionName)
    {
        SetForegroundWindow(FindWindow(className, CaptionName));
    }

    private void Alert()
    {        
        string title = "WoW Queue Alert: Message";
        string message = "The Queue is ready to accept!";
        MessageBoxButtons buttons = MessageBoxButtons.YesNo;
        DialogResult result;

        result = MessageBox.Show(new Form() { TopMost = true }, message, title, buttons, MessageBoxIcon.Information);
        if (result == System.Windows.Forms.DialogResult.Yes)
        {
        BringToFront("World of Warcraft Retail", "World of Warcraft");
        } 
    }

我真的没有看到关于魔兽世界的任何特别之处,并且应该通过记事本示例如何工作正确的代码:

            BringToFront("World of Warcraft Retail", "World of Warcraft");

作为一个全屏程序应该影响它,我无法看到暴雪已经实现了一些东西来阻止这个功能。

编辑:我只是将ClassName设置为null并且工作,因为标题名称只是窗口标题。不知道ClassName是什么我尝试了所有我能找到的东西。

1 个答案:

答案 0 :(得分:0)

您应该使用一些窗口检查工具来检查“魔兽世界”的窗口以获取其Class NameWindow Name。如果您安装了Visual Studio(随附它),建议为Spy++。它可以帮助您轻松检测窗口Class NameWindow Name以及发送到该窗口的Windows消息。

例如,下图显示了当前环境中的所有窗口。突出显示的条目是一个PowerPoint实例,其中包含Caption =" Microsoft PowerPoint"和ClassName =" PPTFrameClass"。

spy++

另一种方法是写一个"永远不活动" winform并从该表单调用GetForegroundWindow以获取所需窗口的窗口句柄。

创建"始终失活" winform,只需覆盖其CreateParams属性:

protected override CreateParams CreateParams
{
    get
    {
        CreateParams p = base.CreateParams;

        p.ExStyle |= 0x8000000; // WS_EX_NOACTIVATE - requires Win 2000 or higher

        return p;
    }
}

通过重写此表单,即使点击鼠标,表单也不会获得焦点。因此,您可以创建一个按钮来触发GetForegroundWindow()。 C#中函数的签名如下所示:

[DllImport("user32.dll")]
public static extern IntPtr GetForegroundWindow();

返回当前前景窗口的窗口句柄。