C# 如何禁用windows+;windows窗体中的d组合键

C# 如何禁用windows+;windows窗体中的d组合键,c#,winforms,forms,c#-4.0,keyboard-shortcuts,C#,Winforms,Forms,C# 4.0,Keyboard Shortcuts,我有一个windows窗体,看起来像一个小部件 我必须禁用alt+f4 win+d等组合键。因为小部件没有使用快捷键最小化关闭的属性 我已经在我的小部件中禁用了win+d键,但它禁用了所有应用程序的shorcut 我要做的是,只为我的应用程序(比如widget)禁用shorcut键 当有人按任意win+d时,像internet explorer(如果打开)这样的后台应用程序将最小化或最大化 知道我该怎么做吗 像雨量计或者xwidget都有相同的属性!知道他们怎么做吗 在Winforms中不能这样

我有一个windows窗体,看起来像一个小部件

我必须禁用alt+f4 win+d等组合键。因为小部件没有使用快捷键最小化关闭的属性

我已经在我的小部件中禁用了win+d键,但它禁用了所有应用程序的shorcut

我要做的是,只为我的应用程序(比如widget)禁用shorcut键

当有人按任意win+d时,像internet explorer(如果打开)这样的后台应用程序将最小化或最大化

知道我该怎么做吗


像雨量计或者xwidget都有相同的属性!知道他们怎么做吗

在Winforms中不能这样做


您必须创建一个

您可以使用全局键盘挂钩,您可以看到一个如何执行此操作的示例, 然后只需在你的钩子中听win+d组合,在这种情况下,不要向前传递呼叫

public partial class MainForm : Form
{
        readonly KeyboardFilter kbFilter = new KeyboardFilter(new Keys[] 
        { 
            Keys.LWin | Keys.D,
            Keys.RWin | Keys.D, 
            Keys.LWin | Keys.X, 
            Keys.RWin | Keys.X,
            Keys.Alt | Keys.F4
        });
}
确保在
表单关闭事件中使用
KeyboardFilter.Dispose()

KeyboardFilter
类取自


虽然“小部件项目”可以解决这个问题,但你不应该说它绝对不能在WinForms中完成。那么,我可以看看你的答案吗?
:)
从技术上讲,它是可以完成的,但从实际角度看,说它不能完成已经足够接近了。无论如何,这是不应该的。@user1693655我想你误解了这个答案。您没有创建小部件。您正在创建一个表单,然后查看它与小部件的区别,并一次一个地更改所有这些内容。你甚至不应该这么做。如果你想要一个小部件,为什么不创建一个小部件呢?这样您就不必禁用任何全局快捷键,因为全局快捷键已经在做正确的事情了。@user1693655我不知道,我只知道您所问问题的答案对您没有帮助。禁用Win+D是错误的做法,如果您在其他应用程序处于活动状态时将其保持启用状态,也将最小化窗口。找出正确的问题,你会得到更有用的答案。我认为应该问的问题是“如何防止我的窗口被最小化”,但我不确定这是否会遗漏其他一些细节。为什么要禁用Win+X和Win+D?我理解为什么Alt+F4,但我不认为有必要为“小部件”禁用这两个选项。@AlvinWong win+x就是一个例子,而对于win+d,我希望我的win表单与小部件相同,我正在接近它,我不想创建小部件项目,因为我的小部件必须在不同的操作系统和规范下工作,我相信你把一个简单的问题复杂化了。你可以在你的程序中解释你期望的行为,因为我认为你可能想错了方向。我只是想这样。我不希望我的表单被最小化,但应用程序(如果像音乐播放器一样打开)将被最小化或最大化,所以主要的一点是防止表单被最小化,但不要禁用这些组合键。好的,你说“你在互联网上的某个地方找到了这个”,然后您还应该引用源代码并对其给予信任。@AppDeveloper它将为我的表单禁用win密钥,并且它将被删除吗?就像运行我的表单和sm1按win+d一样,它不应该最小化我的应用程序,而应该最小化背景应用程序,如i.e或music Player?@AppDeveloper it works global。将在所有应用程序中完成!我不想对allwell禁用它,扩展KeyBoardFilter,添加一个布尔属性,仅当表单正常时才加上键|最大化!您能提供一些代码吗?因为上面的代码将注册密钥并禁用它@AppDeveloper
class KeyboardFilter : IDisposable
{
    private Keys[] mFilter;
    private IntPtr mHook;
    private readonly LowLevelKeyboardProc mProc;

    public KeyboardFilter(Keys[] keysToFilter)
    {
        // Install hook
        mFilter = keysToFilter;
        ProcessModule mod = Process.GetCurrentProcess().MainModule;
        mProc = KeyboardProc;   // Avoid garbage collector problems
        mHook = SetWindowsHookEx(13, mProc, GetModuleHandle(mod.ModuleName), 0);
        if (mHook == IntPtr.Zero) throw new Win32Exception(Marshal.GetLastWin32Error(), "Failed to set hook");
    }
    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }
    protected virtual void Dispose(bool disposing)
    {
        if (disposing)
        {
            // Release hook
            if (mHook != IntPtr.Zero)
            {
                UnhookWindowsHookEx(mHook);
                mHook = IntPtr.Zero;
            }
        }
    }
    ~KeyboardFilter()
    {
        Dispose(false);
    }
    private IntPtr KeyboardProc(int nCode, IntPtr wp, IntPtr lp)
    {
        // Callback, filter key
        if (nCode >= 0)
        {
            KBDLLHOOKSTRUCT info = (KBDLLHOOKSTRUCT)Marshal.PtrToStructure(lp, typeof(KBDLLHOOKSTRUCT));
            foreach (Keys key in mFilter)
                if ((key & Keys.KeyCode) == info.key && CheckModifier(key)) return (IntPtr)1;
        }
        return CallNextHookEx(mHook, nCode, wp, lp);
    }
    private static bool CheckModifier(Keys key)
    {
        // Check if modifier key in required state
        if ((key & Keys.Control) == Keys.Control &&
          GetAsyncKeyState(Keys.LControlKey) == 0 && GetAsyncKeyState(Keys.RControlKey) == 0) return false;
        if ((key & Keys.Shift) == Keys.Shift &&
          GetAsyncKeyState(Keys.LShiftKey) == 0 && GetAsyncKeyState(Keys.RShiftKey) == 0) return false;
        if ((key & Keys.Alt) == Keys.Alt &&
          GetAsyncKeyState(Keys.LMenu) == 0 && GetAsyncKeyState(Keys.RMenu) == 0) return false;
        return true;
    }

    // P/Invoke declarations
    [StructLayout(LayoutKind.Sequential)]
    private struct KBDLLHOOKSTRUCT
    {
        public Keys key;
        public int scanCode;
        public int flags;
        public int time;
        public IntPtr extra;
    }
    private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);
    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern IntPtr SetWindowsHookEx(int id, LowLevelKeyboardProc callback, IntPtr hMod, uint dwThreadId);
    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern bool UnhookWindowsHookEx(IntPtr hook);
    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern IntPtr CallNextHookEx(IntPtr hook, int nCode, IntPtr wp, IntPtr lp);
    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern IntPtr GetModuleHandle(string name);
    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    private static extern short GetAsyncKeyState(Keys key); 
}