使用键盘快捷键从系统托盘最大化C#应用程序

3

我想知道是否有一种方式可以通过键盘快捷键而不是点击来最大化我的 Windows 窗体应用程序在系统托盘中吗?

目前我是使用以下代码最小化:

//Minimize to Tray with over-ride for short cut
private void MinimiseToTray(bool shortCutPressed)
{
    notifyIcon.BalloonTipTitle = "Minimize to Tray App";
    notifyIcon.BalloonTipText = "You have successfully minimized your app.";

    if (FormWindowState.Minimized == this.WindowState || shortCutPressed)
    {
        notifyIcon.Visible = true;
        notifyIcon.ShowBalloonTip(500);
        this.Hide();
    }
    else if (FormWindowState.Normal == this.WindowState)
    {
        notifyIcon.Visible = false;
    }
}

因此,我需要一个可以最大化它的键盘快捷键。非常感谢!
4个回答

5
编辑:如果您只是想“保留密钥组合”来执行应用程序中的某些操作,那么低级键盘钩子不仅过度,而且是一种不好的做法。在我个人看来,这可能会让人们认为您正在记录按键!使用热键即可。
考虑到您的图标不会有键盘焦点,因此您需要注册全局键盘热键。
其他类似的问题:
示例来自Global Hotkeys With .NET:
Hotkey hk = new Hotkey();
hk.KeyCode = Keys.1;
hk.Windows = true;
hk.Pressed += delegate { Console.WriteLine("Windows+1 pressed!"); };

if (!hk.GetCanRegister(myForm))
{ 
    Console.WriteLine("Whoops, looks like attempts to register will fail " +
                      "or throw an exception, show error to user"); 
}
else
{ 
    hk.Register(myForm); 
}

// .. later, at some point
if (hk.Registered)
{ 
   hk.Unregister(); 
}

我想使用它,但是我需要 #include/using 等什么?它说 Hotkey 不存在。 - raaj
这个页面链接了一个封装类(“使用.NET的全局热键”),其中大部分功能都是基于Win32的特性。 - Ray Hayes

3

3
如果你愿意使用全局热键,就不需要进行“低级”操作。低级操作往往是为了窥探任何键盘活动,而不是为自己的使用保留一个按键组合。 - Ray Hayes
1
我必须同意@RayHayes的观点,你甚至可能会被一些反恶意软件程序所指责。 - Mike Perrenoud

1
我赞同Franck关于全局键盘钩子的建议。就我个人而言,我在CodeProject文章“Processing Global Mouse and Keyboard Hooks in C#”中有非常好的经验。
正如他们在文章中所写的那样,你可以做一些事情:
private UserActivityHook _actHook;

private void MainFormLoad(object sender, System.EventArgs e)
{
    _actHook = new UserActivityHook();

    _actHook.KeyPress += new KeyPressEventHandler(MyKeyPress);
}

然后您可以在MyKeyPress处理程序中调用一个函数来打开您的窗口。


1
但现在你不仅需要一个简单的键盘组合来显示应用程序,还需要处理整个过程中产生的每个按键。 - Ray Hayes
1
通过获取比你需要的更多内容(例如所有密钥而不是特定组合),不仅会增加更多工作 - 需要过滤结果以获得所需内容,而且也没有遵循“只请求所需内容”的原则。想象一下,如果Android手机上的“记事本”应用程序要求“拨打电话”访问权限-您会感到担忧。如果托盘实用程序想要查看我键入的所有密码,以便它可以显示自己,我也会感到担忧。杀毒工具也可能代表我感到担忧! - Ray Hayes
@RayHayes 是的,但真的,这对最终用户有什么影响? - Uwe Keim
1
这不是最终用户在询问,我想这是一个开发者。如果反病毒工具检测到键盘钩子的使用并将其添加到恶意软件列表中,可能会影响最终用户!再次回到我的“安卓”示例,如果记事本应用程序想要访问我的手机功能,除非被滥用,否则它对我没有太大影响。 - Ray Hayes
抱歉,这对我来说太深奥了。 - Uwe Keim
1
低级键盘钩子应该作为最后的手段使用,如果全局热键无法完成您需要的工作。当您像这样低级别地挂钩时,您正在运行每个应用程序中每个按键的代码,这不仅可能会减慢它或潜在地创建其他按键事件处理程序的问题,而且可能会被杀毒软件等标记。避免不必要的开销和问题并不是“神秘的”。像这样使用钩子更类似于使用文本框来存储字符串而不是数组或列表-它可以工作,但编码质量较差。 - WiredEarp

1

如果您按照这里的指南操作,它将向您展示如何注册全局快捷键。

public partial class Form1 : Form
{
    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.
        // You can change this.
        hook.RegisterHotKey(ModifierKeys.Control | ModifierKeys.Alt, Keys.F12);
    }

    private void hook_KeyPressed(object sender, KeyPressedEventArgs e)
    {
        // Trigger your function
        MinimiseToTray(true);
    }

    private void MinimiseToTray(bool shortCutPressed)
    {
        // ... Your code
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接