1

我有一个在后台运行的程序,当发生某些事情时会出现一个消息框,我想要它,所以单击“是”将切换到指定的程序。

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

窗口标题在任务管理器上是“魔兽世界”,它被称为“魔兽世界零售”,当我检查它的属性时,它显示“Wow-64”属性,在属性上它说产品名称是“魔兽世界”所以我已经尝试了这些的所有组合,但没有任何效果。如果我把代码工作:
BringToFront("Notepad", "Untitled - Notepad");

所以它有效,我只是不知道我需要什么才能将它应用于 WoW。

我的代码是:

    [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");
        } 
    }

我真的没有看到关于 WoW 的任何特别之处,并且按照记事本示例的工作方式,正确的代码应该是:

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

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

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

4

1 回答 1

0

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

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

间谍++

另一种方法是编写一个“始终不激活”的 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();

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

于 2014-08-30T17:13:05.663 回答