C# winform 禁用最小化和还原按钮(消息循环截获处理)
项目中遇到一些问题,需要根据权限配置去控制用户对系统平台是否可以最小化和还原窗口大小的操作,并且屏蔽系统的一些快捷键,比如:alt+F4,windows键,任务管理器等一些操作,代码如下:
(禁止窗口最小化和还原(窗口启动之后为最大化))
偷梁换柱(o(∩_∩)o 哈哈)
重写WndProc方法:
const int SC_MINIMIZE = 0xF020;//窗体最小化消息
const int SC_MAXIMIZE = 0xF030;//窗体最大化消息
const int SC_NOMAL = 0xF120;//窗体还原消息
protected override void WndProc(ref Message m)
{
if (m.WParam.ToInt32() == SC_MINIMIZE)//点击最小化
{
//还可以做些其它的操作
m.WParam = (IntPtr)SC_MAXIMIZE;
}
if (m.WParam.ToInt32() == SC_NOMAL)//点击还原
{
//还可以做些点还原按钮时其它的操作
m.WParam = (IntPtr)SC_MAXIMIZE;
}
base.WndProc(ref m);
}
下面是禁用快捷键的方法:
先写一个钩子的公用类,代码如下:
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.IO;
using System.Windows.Forms;
using System.Reflection;
namespace SISS.Client
{
public class KeyBoardHook
{
#region Delegates
public delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam);
#endregion
#region 变量声明
private HookProc KeyboardHookProcedure;
private FileStream MyFs; // 用流来屏蔽ctrl alt delete
private const byte LLKHF_ALTDOWN = 0x20;//ALT
private const byte VK_ESCAPE = 0x1B;//ESC键
private const byte VK_F4 = 0x73;//F4健
private const byte VK_NUMLOCK = 0x90;//小键盘
private const byte VK_SHIFT = 0x10;//SHIFT键盘
private const byte VK_TAB = 0x09;//TAB键盘
public const int WH_KEYBOARD = 13;//获得键盘
private const byte VK_RCONTROL = 0xA3;//CTRL键
private static int hKeyboardHook = 0;
#endregion
#region 对应COM的函数
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);
// 卸载钩子
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern bool UnhookWindowsHookEx(int idHook);
// 继续下一个钩子
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern int CallNextHookEx(int idHook, int nCode, Int32 wParam, IntPtr lParam);
#endregion
#region 方法
private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam)
{
KeyMSG m = (KeyMSG)Marshal.PtrToStructure(lParam, typeof(KeyMSG));
if (((Keys)m.vkCode == Keys.LWin || (Keys)m.vkCode == Keys.RWin)
|| ((m.vkCode == VK_TAB) && ((m.flags & LLKHF_ALTDOWN) != 0))//屏蔽alt+TAB
|| (m.vkCode == VK_F4) && ((m.flags & LLKHF_ALTDOWN) != 0)//屏蔽alt+F4
|| ((Keys)m.vkCode == Keys.LWin) && ((Keys)m.vkCode == Keys.D)//屏蔽windows+D键
|| ((Keys)m.vkCode == Keys.RWin) && ((Keys)m.vkCode == Keys.D)
|| (m.vkCode == VK_ESCAPE) && ((m.flags & LLKHF_ALTDOWN) != 0)//屏蔽alt+Esc
|| (m.vkCode == VK_RCONTROL) && (m.vkCode == VK_ESCAPE)//屏蔽Ctrl+Esc
)
{
return 1;
}
return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam);
}
/// <summary>
/// 启动钩子
/// </summary>
public void HookStart()
{
if (hKeyboardHook == 0)
{
// 创建HookProc实例
KeyboardHookProcedure = new HookProc(KeyboardHookProc);
hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD,
KeyboardHookProcedure,
Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]),
0);
// 如果设置钩子失败
if (hKeyboardHook == 0)
{
HookStop();
}
//用二进制流的方法打开任务管理器。而且不关闭流.这样任务管理器就打开不了
MyFs = new FileStream(Environment.ExpandEnvironmentVariables("%windir%\\system32\\taskmgr.exe"),
FileMode.Open);
byte[] MyByte = new byte[(int)MyFs.Length];
MyFs.Write(MyByte, 0, (int)MyFs.Length);
}
}
/// <summary>
/// 卸载钩子
/// </summary>
public void HookStop()
{
bool retKeyboard = true;
if (hKeyboardHook != 0)
{
retKeyboard = UnhookWindowsHookEx(hKeyboardHook);
hKeyboardHook = 0;
}
if (null != MyFs)
{
MyFs.Close();
}
if (!(retKeyboard))
{
throw new Exception("卸载钩子失败");
}
}
#endregion
#region Nested type: KeyMSG
public struct KeyMSG
{
public int vkCode;//获得键盘输入的直
public int scanCode;
public int flags;//键盘的状态
}
#endregion
}
}
再在窗口Load事件调用就OK了,关闭的时候一定要卸载钩子,要不键盘快捷键还是不能用!
还需了解一些windows消息机制,消息数值在winuser.h头文件中!
C# winform 禁用最小化和还原按钮(消息循环截获处理)相关推荐
- WinForm 捕获最小化事件
[Dotnet]C# WinForm 捕获最小化事件 2009/02/10 09:22 转自: 虽然Form类没有提供Minimize的事件,但还是可以通过重载Deactive来实现 当Form失去焦 ...
- WPF 窗体最大化、最小化、还原 | WPF 最大化/最小化 按钮图标切换
UI界面: <Window x:Class="Test.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2 ...
- C# 实现WinForm窗口最小化到系统托盘代码
注:本程序是在VS2005基础上写的. 1.如果不想让程序在任务栏中显示,请把窗体的属性ShowInTaskbar设置为false; 2.如果想让程序启动时就最小化,请设置窗体的属性WindowSta ...
- C# WinForm窗口最小化到系统托盘
1.设置WinForm窗体属性showinTask=false 2.加notifyicon控件notifyIcon1,为控件notifyIcon1的属性Icon添加一个icon图标. 3.添加窗体 ...
- 开机全屏启动谷歌浏览器,打开指定页面,不可关闭最小化和还原
一.首先创建一个浏览器的快捷方式 二.右键快捷方式->属性 目标 :"C:\Program Files (x86)\Google\Chrome\Application\chrome_p ...
- Q窗口操作函数(窗口最大化,全屏,隐藏最大化最小化按钮)
Qt窗口中的一些小技术总结 //Qt主窗口没有最小化,最大化按钮且最大化显示 int main(int argc, char *argv[]) { QApplication a(argc, argv ...
- Qt 窗口操作函数(置顶、全屏,最大化最小化按钮设置等)
一.窗口置顶 与 取消置顶 void MainWindow::on_windowTopButton_clicked() {if (m_flags == NULL){m_flags = windowFl ...
- MFC手动添加窗口 最大化 最小化 还原 关闭
最大化.最小化.还原 这些都是系统命令 这样操作比较合理 C/C++ code? 1 2 3 PostMessage(WM_SYSCOMMAND, SC_MAXIMIZE, 0); PostMessa ...
- 在程序中设置最小化、最大化、关闭按钮
下面程序ControlBoxTest演示了最小化.最大化.关闭按钮的设置方法及效果. (1)打开VS2008,新建一个Windows窗体应用程序,并命名为ControlBoxTest. (2) ...
最新文章
- poj1273Drainage Ditches
- Vue学习笔记(四)—— 前端路由
- 汇编中求补指令NEG的小问题..
- bigdecimal js 判断等于0_Js BigDecimal实现精确加减乘除运算的方法
- Intelij IDEA中web项目抛org.apache.ibatis.binding.BindingException: Invalid bound statement(not found):异常
- 使用Eclipse远程调试
- C语言贴图图片路径不对,backgroundImage 路径问题 vue 图片的引入方式
- vss导入git vss导入svn
- 修改系统时区 /etc/localtime
- 探究美国多发龙卷风的成因
- 如何让3ds Max 2016导入smd文件
- Python爬虫 | 以滑雪为例演示大众点评商铺信息采集!
- 支持中文的deepdive:斯坦福大学的开源知识抽取工具(三元组抽取)
- 汽车变速器测试系统ETest
- 进入Google十大排名的10个步骤
- android 无障碍 webview,Android WebView使用
- JAVA信息管理系统毕业设计 开题报告
- php %3c0x1a%3e是什么_利用ThinkPHP漏洞扫描攻击
- 函数周期表丨EXCEPT
- 网页篡改事件应急案例
热门文章
- xampp mysql创建表_xampp怎样创建数据表和删除数据表 来学习吧
- 把室友的STM32换成了GD32,会被打吗?
- 干货 | extern的用法解析
- 老工程师谈电子物料:别拿一分钱不当回事!
- 美国检测病毒3270美元,中国仅40,问题出在哪?
- js写的程序如何上线到linux,将 Node.js 应用发布到 Linux 应用服务 - Visual Studio | Microsoft Docs...
- c++语言函数strcpy,C++中函数的安全版本的意义及strcpy函数的功能和差别(图)
- 360浏览器打不开qq空间_网页突然打不开其他软件却能上网?怎么解决?
- Java程序编译的几个方法(编辑器Notepad++)
- FPGA构造spi时序——AD7176为例(转)