使用c#从线程捕获热键;

使用c#从线程捕获热键;,c#,C#,我正在使用下面的代码捕获ctrl+alt+Q热键,这非常有效。 但是,我想在后台应用程序中使用它。因为我的应用程序没有任何表单,所以我希望在类文件中使用相同的代码 我很困惑,因为我无法在类文件中编写事件处理程序[keypressed]。 相反,我想使用按键在线程 请帮忙 public DialogResult Result; KeyboardHook hook = new KeyboardHook(); public Form1() { Initial

我正在使用下面的代码捕获ctrl+alt+Q热键,这非常有效。 但是,我想在后台应用程序中使用它。因为我的应用程序没有任何表单,所以我希望在类文件中使用相同的代码

我很困惑,因为我无法在类文件中编写事件处理程序[keypressed]。 相反,我想使用按键在线程

请帮忙

 public DialogResult Result; 
    KeyboardHook hook = new KeyboardHook();
    public Form1()
    {
        InitializeComponent();
        // register the event that is fired after the key press.
        hook.KeyPressed += new EventHandler<KeyPressedEventArgs>(hook_KeyPressed);
        // register the control + alt + F12 combination as hot key.
        hook.RegisterHotKey((ModifierKeys)2 | (ModifierKeys)1, Keys.Q);
    }

    void hook_KeyPressed(object sender, KeyPressedEventArgs e)
    { 

        Result = MessageBox.Show("Are you sure, you want to log off?","Log off"
                ,MessageBoxButtons.YesNo
                ,MessageBoxIcon.Warning);

        if (Result == DialogResult.Yes)
        {

        }
        else
        {

        }
    }
公共对话框结果;
键盘挂钩=新键盘挂钩();
公共表格1()
{
初始化组件();
//注册按键后触发的事件。
hook.KeyPressed+=新事件处理程序(hook\u KeyPressed);
//将control+alt+F12组合注册为热键。
hook.RegisterHotKey((ModifierKeys)2 |(ModifierKeys)1,key.Q);
}
无效钩_键按下(对象发送器,按键打开)
{ 
结果=MessageBox.Show(“您确定要注销吗?”,“注销”
,MessageBoxButtons.YesNo
,MessageBoxIcon.Warning);
if(Result==DialogResult.Yes)
{
}
其他的
{
}
}

如果您想捕获没有表单的全局热键,恐怕您不能

原因是全局热键被发送到窗口句柄(并在wndProc,又名消息泵中处理)

因此,基本上Windows的工作方式是,如果没有表单接收全局热键,则无法使用全局热键

然而,我不能完全肯定这是你想要做的。但另一方面,没有表单也不会有任何本地热键,所以我看不出它可能是什么


你可能想进一步澄清一下你的问题(无意冒犯)

好吧,我会用一个表格。但是有没有办法让窗体不可见,它甚至不应该出现在任务栏上。可能的谢谢。是的,有可能。当我的应用程序不可见时,我捕获热键并将其放在最前面。我正在使用以下命令,但仍在获取表单。private void InitializeComponent(){this.SuspendLayout();///Form1//this.Visible=false;this.ShowInTaskbar=false;}不幸的是,表单无法启动,因为它不可见。您可以通过将其隐藏在OnActivate事件中来“伪造”它,但它会在启动时短暂显示。或者,您必须创建自己的ApplicationContext,并在void main(Application.run(yourContext))中运行它-但这并不像听起来那么简单:-(