C# 如何禁用windows+;windows窗体中的d组合键
我有一个windows窗体,看起来像一个小部件 我必须禁用alt+f4 win+d等组合键。因为小部件没有使用快捷键最小化关闭的属性 我已经在我的小部件中禁用了win+d键,但它禁用了所有应用程序的shorcut 我要做的是,只为我的应用程序(比如widget)禁用shorcut键 当有人按任意win+d时,像internet explorer(如果打开)这样的后台应用程序将最小化或最大化 知道我该怎么做吗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中不能这样
像雨量计或者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);
}