我有一个在后台运行的程序,当出现某个消息框时,我想拥有它,所以单击是将切换到指定的程序。
我只是找不到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是什么我尝试了所有我能找到的东西。
答案 0 :(得分:0)
您应该使用一些窗口检查工具来检查“魔兽世界”的窗口以获取其Class Name
和Window Name
。如果您安装了Visual Studio(随附它),建议为Spy++。它可以帮助您轻松检测窗口Class Name
和Window 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();
返回当前前景窗口的窗口句柄。