c#修复全局热键
我已经创建了一个全局热键,首先它工作得很好。但是当我开始在表单中添加一些设计和额外的代码时,它就不再起作用了。然后我回到了基础,只是注释掉了添加到原始代码中的代码,但仍然没有运气。代码如下: 热键类代码: 类热键 { 主表单代码:(下面的代码只是与热键相关的代码)c#修复全局热键,c#,global-hotkey,C#,Global Hotkey,我已经创建了一个全局热键,首先它工作得很好。但是当我开始在表单中添加一些设计和额外的代码时,它就不再起作用了。然后我回到了基础,只是注释掉了添加到原始代码中的代码,但仍然没有运气。代码如下: 热键类代码: 类热键 { 主表单代码:(下面的代码只是与热键相关的代码) 正如你在WndProc中看到的那样,我注释掉了我想要发生的事情,只写了一个简单的消息框,但是你猜怎么着,当我按下任何已注册的热键(Ctrl+T,Ctrl+R)时,没有消息框出现.o为什么会发生这种情况?当代码只是关于热键时,它在第一时
正如你在WndProc中看到的那样,我注释掉了我想要发生的事情,只写了一个简单的消息框,但是你猜怎么着,当我按下任何已注册的热键(Ctrl+T,Ctrl+R)时,没有消息框出现.o为什么会发生这种情况?当代码只是关于热键时,它在第一时间就可以正常工作。提前感谢您的帮助!我将在注释中发布一个答案,因为它似乎已在故障排除过程中得到解决 Op正在使用
FindWindow(null,“Form1”)
获取句柄的引用,但是这可能是定位了错误的句柄。(可能From1的内存中有多个实例?)
通过更改为使用
this.Handle
,op可以保证将热键注册到他正在调用的实例的正确句柄。它是否工作一段时间,然后在运行应用程序后停止工作?我过去遇到过一些问题,您丢失了对从应用程序触发事件的处理程序的引用按键?这是一个很长的机会,但在保持对处理程序的引用处于活动状态方面可能会出现类似的问题吗?一点也不起作用。当我运行它时,然后按下注册键,什么都没有发生。@Joe_DM嘿,伙计们,我只是尝试创建一个新的WinForm,只为全局热键编写代码,它成功了!我如何修复它?你认为没有人知道吗我真的很难过。只花了一个小时,没有太多的信息,因为你说它在一个新的应用程序中工作。如果上面的代码在工作,那么它一定是其他东西?
public enum fsModifers
{
Alt = 0x0001,
Control = 0x0002,
Shift = 0x0004,
Window = 0x0008,
}
IntPtr hWnds;
public HotKeys(IntPtr hWnd)
{
this.hWnds = hWnd;
}
public void RegisterHotKeys()
{
RegisterHotKey(hWnds, 1, (uint)fsModifers.Control, (uint)Keys.T);
RegisterHotKey(hWnds, 2, (uint)fsModifers.Control, (uint)Keys.R);
}
public void UnregisterHotKeys()
{
UnregisterHotKey(hWnds, 1);
UnregisterHotKey(hWnds, 2);
}
#region WindowsAPI
[DllImport("user32.dll")]
private static extern bool RegisterHotKey(IntPtr hWnd, int id, uint fsModifiers, uint vk);
[DllImport("user32.dll")]
private static extern bool UnregisterHotKey(IntPtr hWnd, int id);
#endregion
}
private void Form1_Load(object sender, EventArgs e)
{
thisWindow = FindWindow(null, "Form1");
_hotKeys = new HotKeys(thisWindow);
_hotKeys.RegisterHotKeys();
}
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
_hotKeys.UnregisterHotKeys();
}
protected override void WndProc(ref Message keyPressed)
{
if (keyPressed.Msg == 0x0312)
{
MessageBox.Show("my msg");
//keyPress = keyPressed.WParam;
//if (keyPress == (IntPtr)1)
//{
// if (!autoSkillIsOn)
// {
// timer1.Start();
// autoSkillIsOn = true;
// }
// else if (autoSkillIsOn)
// {
// timer1.Stop();
// autoSkillIsOn = false;
// }
//}
//else if (keyPress == (IntPtr)2)
//{
// MessageBox.Show("pressed ctrl R");
//}
}
base.WndProc(ref keyPressed);
}