为什么
在winform窗体全屏的时候,没有办法用LWin+M最小化到状态栏呢
protected override bool ProcessCmdKey(ref System.Windows.Forms.Message msg, System.Windows.Forms.Keys keyData)
{
switch (keyData)
{
case Keys.Escape:
CloseFullScreen();//esc关闭窗体
return true;
case Keys.F11:
CloseFullScreen();
return true;
case Keys.LWin | Keys.M:
this.WindowState = FormWindowState.Minimized;
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}
Keys.LWin & Keys.M
protected override bool ProcessCmdKey(ref System.Windows.Forms.Message msg, System.Windows.Forms.Keys keyData)
{
switch (keyData)
{
case Keys.Escape:
CloseFullScreen();//esc关闭窗体
return true;
case Keys.F11:
CloseFullScreen();
return true;
case Keys.LWin & Keys.M:
this.WindowState = FormWindowState.Minimized;
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}
这个貌似也不行
@Code Is Easy: 我这边测试着可以啊
@artwl: 你是如何写的呢,主要这个窗体一个开始是无边框的状态
@Code Is Easy: 我用的代码跟你的一样啊
@artwl: 是在this.FormBorderStyle = FormBorderStyle.None
这种状态下去设置的吗
@artwl: 你把你代码发给我看看
@Code Is Easy: 我开始的代码没有用this.FormBorderStyle = FormBorderStyle.None,加上之后也不行了,我正在测试
@artwl: 好的
希望可以成功,分就给你
@artwl: 兄弟实现得如何呢
钩子:
public class KeyboardHookLib { private const int WH_KEYBOARD_LL = 13; //键盘 //键盘处理事件委托. private delegate int HookHandle(int nCode, int wParam, IntPtr lParam); //客户端键盘处理事件 public delegate void ProcessKeyHandle(HookStruct param, out bool handle); //接收SetWindowsHookEx返回值 private static int _hHookValue = 0; //勾子程序处理事件 private HookHandle _KeyBoardHookProcedure; //Hook结构 [StructLayout(LayoutKind.Sequential)] public class HookStruct { public int vkCode; public int scanCode; public int flags; public int time; public int dwExtraInfo; } //设置钩子 [DllImport("user32.dll")] private static extern int SetWindowsHookEx(int idHook, HookHandle lpfn, IntPtr hInstance, int threadId); //取消钩子 [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] private static extern bool UnhookWindowsHookEx(int idHook); //调用下一个钩子 [DllImport("user32.dll")] private static extern int CallNextHookEx(int idHook, int nCode, int wParam, IntPtr lParam); //获取当前线程ID [DllImport("kernel32.dll")] private static extern int GetCurrentThreadId(); //Gets the main module for the associated process. [DllImport("kernel32.dll")] private static extern IntPtr GetModuleHandle(string name); private IntPtr _hookWindowPtr = IntPtr.Zero; //构造器 public KeyboardHookLib() { } //外部调用的键盘处理事件 private static ProcessKeyHandle _clientMethod = null; /// <summary> /// 安装勾子 /// </summary> /// <param name="hookProcess">外部调用的键盘处理事件</param> public void InstallHook(ProcessKeyHandle clientMethod) { _clientMethod = clientMethod; // 安装键盘钩子 if (_hHookValue == 0) { _KeyBoardHookProcedure = new HookHandle(GetHookProc); _hookWindowPtr = GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName); _hHookValue = SetWindowsHookEx( WH_KEYBOARD_LL, _KeyBoardHookProcedure, _hookWindowPtr, 0); //如果设置钩子失败. if (_hHookValue == 0) UninstallHook(); } } //取消钩子事件 public void UninstallHook() { if (_hHookValue != 0) { bool ret = UnhookWindowsHookEx(_hHookValue); if (ret) _hHookValue = 0; } } //钩子事件内部调用,调用_clientMethod方法转发到客户端应用。 private static int GetHookProc(int nCode, int wParam, IntPtr lParam) { if (nCode <= 0) { //转换结构 HookStruct hookStruct = (HookStruct)Marshal.PtrToStructure(lParam, typeof(HookStruct)); if (_clientMethod != null) { bool handle = false; //调用客户提供的事件处理程序。 _clientMethod(hookStruct, out handle); if (handle) return 1; //1:表示拦截键盘,return 退出 } } return CallNextHookEx(_hHookValue, nCode, wParam, lParam); } }
窗体:
public static bool flag = false; private KeyboardHookLib _keyboardHook = null; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { this.FormBorderStyle = FormBorderStyle.None; _keyboardHook = new KeyboardHookLib(); _keyboardHook.InstallHook(this.KeyPress); } public void KeyPress(KeyboardHookLib.HookStruct hookStruct, out bool handle) { handle = false; if (hookStruct.vkCode == 91) { flag = true; handle = true; } if (hookStruct.vkCode == (int)Keys.M) { if (flag) { this.WindowState = FormWindowState.Minimized; } } }
可以运行,但我这边测试时会弹一个警告框,目前还不知道为什么
@artwl: 用是可以用,不过好像在别的窗体下按LWIN+M不能用了
这个能行吗
@Code Is Easy: 你试试就知道了。
@荒野的呼唤: 不行,达不到这个效果