我正在使用一个C#应用程序来侦听一个全局组合键(ctrl+F9),它将把一个特定的窗口带到前面。
这是我用来把一个窗口放在前面的代码,它只有在被一个Button事件触发时才有效:
private void button3_Click(object sender, EventArgs e)
{
SetForegroundWindow(ptrActiveWindow.ToInt32());
ShowWindowAsync(ptrActiveWindow, SW_RESTORE);
}对于钩子,我使用了一个取自http://www.codeproject.com/KB/cs/CSLLKeyboardHook.aspx的类,它完整地列出在这里:
http://code.google.com/p/code-commenter/source/browse/trunk/key+preview/globalKeyboardHook.cs?spec=svn3&r=3
每当我在CTRL KeyDown之后和CTRL KeyUp之前有一个F9 KeyUp事件时(CTRL仍然被按下),我调用我的方法:
private void restore(IntPtr hWnd)
{
IntPtr ptrCurrentActiveWindow = GetForegroundWindow(); //comment line
ShowWindowAsync(ptrCurrentActiveWindow, SW_MINIMIZE); //comment line
ShowWindowAsync(hWnd, SW_RESTORE);
SetFocus(hWnd);
SetForegroundWindow(hWnd.ToInt32());
}这不会做任何事情。我的窗口在后台被激活(我可以看到它在任务栏中闪烁),但没有恢复。
解决这个问题的唯一方法是使用注释代码:最小化当前活动的窗口,然后恢复我想要看到的窗口。
非常感谢您的帮助,谢谢。
全局热键,工作版本:
private void Form1_Load(object sender, EventArgs e)
{
string atomName = Thread.CurrentThread.ManagedThreadId.ToString("X8") + this.GetType().FullName;
short HotkeyID = GlobalAddAtom(atomName);
if (!RegisterHotKey(this.Handle, HotkeyID, (uint)GlobalHotkeys.MOD_CONTROL, (uint)Keys.D5))
listBox.Items.Add("failed: " + "unable to register hotkey. Error: " + Marshal.GetLastWin32Error().ToString());
else
listBox.Items.Add("succeeded adding hotkey id"+(uint)Keys.D5);
}
protected override void WndProc(ref Message m)
{
const int WM_HOTKEY = 0x0312;
if (m.Msg == WM_HOTKEY)
{
if ((short)m.WParam==HotkeyID)
listBox.Items.Add("Hotkey."+ (short)m.WParam);
}
base.WndProc(ref m);
}发布于 2011-06-11 04:53:42
您的问题是您没有注册全局热键,而是使用了键盘钩子。键盘挂钩不是设计为用作全局热键的。
请改用RegisterHotKey函数。
检查此示例:http://www.pinvoke.net/default.aspx/user32.registerhotkey
您当前面临的问题是,应用程序不能随时将自己放到前台。因为这对用户来说很烦人。它只能在特定事件期间执行此操作。例如应用程序启动或处理真正的全局热键。
系统限制哪些进程可以设置前台窗口。仅当满足以下条件之一时,进程才能设置前台窗口:
发布于 2011-06-11 04:51:13
尝试使用另一个SW_常量,如SW_SHOW。SW_RESTORE仅适用于使用SW_MINIMIZE最小化的窗口
https://stackoverflow.com/questions/6311707
复制相似问题