gpt4 book ai didi

c# - 在 C# 中使用全局热键进行键捕获

转载 作者:太空狗 更新时间:2023-10-30 00:32:47 29 4
gpt4 key购买 nike

我有一个在后台运行的应用程序,就像我可以将我的应用程序保留在系统托盘中一样。如果它保留在系统托盘中,我的应用程序将完成它的工作。每当用户按下 F10 或 F9 时,一些工作就会完成。我试过这个:

public partial class Form1 : Form
{
public int a = 1;

[DllImport("user32.dll")]
public static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vlc);
[DllImport("user32.dll")]
public static extern bool UnregisterHotKey(IntPtr hWnd, int id);


[DllImport("User32.dll")]
private static extern short GetAsyncKeyState(System.Windows.Forms.Keys vKey);
[DllImport("User32.dll")]
private static extern short GetAsyncKeyState(System.Int32 vKey);

const int MYACTION_HOTKEY_ID = 1;

public Form1()
{
InitializeComponent();
RegisterHotKey(this.Handle, MYACTION_HOTKEY_ID, 0, (int) Keys.F9);
RegisterHotKey(this.Handle, MYACTION_HOTKEY_ID, 0, (int)Keys.F10);

this.ShowInTaskbar = false;
}

protected override void WndProc(ref Message m)
{
if (m.Msg == 0x0312 && m.WParam.ToInt32() == MYACTION_HOTKEY_ID && (GetAsyncKeyState(Keys.F9) == -32767))
{
if ((a % 2) != 0)
{
a++;
MessageBox.Show(a.ToString()+"not equal F9");
label1.Text = "not equal F9";
}

if ((a % 2) == 0)
{
a++;
MessageBox.Show(a.ToString()+"equal F9");
label1.Text = " equal F9";
}

}

else if (m.Msg == 0x0312 && m.WParam.ToInt32() == MYACTION_HOTKEY_ID && (GetAsyncKeyState(Keys.F10) == -32767))
{
if ((a % 2) != 0)
{
a++;
MessageBox.Show(a.ToString() + "not equal F10");
label1.Text = "not equal F10";
}

if ((a % 2) == 0)
{
a++;
MessageBox.Show(a.ToString() + "equal F10");
label1.Text = " equal F10";
}

}
base.WndProc(ref m);
}

}

当我使用设置“this.ShowInTaskbar = false”这一行时,它不起作用。但是如果我不设置它,它就可以正常工作。对于我的应用程序,我必须使用这一行。我该如何解决这个问题? ???

最佳答案

您需要订阅操作系统通过本地函数调用(如 RegisterHotKey())发送的某些消息。当你调用这个函数时你通过指定窗口的句柄告诉操作系统将消息发送到哪个窗口,这可以被认为是一个地址。当您设置 ShowInTaskbar = false 时,句柄会发生变化,因此操作系统将不知道从哪里联系您。

查看第一个参数:

RegisterHotKey(this.Handle, MYACTION_HOTKEY_ID, 0, (int) Keys.F9);

要解决您的问题,您可以创建一个派生自 NativeWindow 的类其中“提供窗口句柄和窗口过程的低级封装。”并从该类中(或至少使用该类的句柄,具体取决于您的实现),使用句柄注册热键这永远不会改变。

public sealed class HotkeyManager : NativeWindow, IDisposable
{
public HotkeyManager()
{
CreateHandle(new CreateParams());
}

protected override void WndProc(ref Message m)
{
if (m.Msg == Constants.WM_HOTKEY)
{
//handle hotkey message
}
base.WndProc(ref m);
}

public void Dispose()
{
DestroyHandle();
}
}

关于c# - 在 C# 中使用全局热键进行键捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15434505/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com