博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# winform 禁用最小化和还原按钮(消息循环截获处理)
阅读量:4303 次
发布时间:2019-05-27

本文共 3807 字,大约阅读时间需要 12 分钟。

项目中遇到一些问题,需要根据权限配置去控制用户对系统平台是否可以最小化和还原窗口大小的操作,并且屏蔽系统的一些快捷键,比如: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头文件中!

转载地址:http://sjlws.baihongyu.com/

你可能感兴趣的文章
MongoDB-与SpringBoot集成
查看>>
Kafka-与SpringBoot的集成
查看>>
SpringBoot-HBase
查看>>
SpringBoot-源码阅读
查看>>
Mybatis-SpringBoot集成/配置
查看>>
Eclipse-JAVA版本
查看>>
Mysql-centos下的安装
查看>>
Maven-打包的时候丢失非.java的文件
查看>>
Spring-MetadataReader接口
查看>>
SpringMvc-@ModelAttribute注解
查看>>
Spring-context-ApplicationContextInitializer接口TODO
查看>>
Spring-BeanFactoryPostProcessor
查看>>
Spring-BeanDefinitionRegistryPostProcessor接口
查看>>
Spring-AnnotationMetadata
查看>>
Spring-aop-TargetSource/ProxyFactory/DefaultAopProxyFactory
查看>>
IP分类以及子网掩码
查看>>
Servlet-HttpServletRequestWrapper
查看>>
SpringMvc-HandlerMethodArgumentResolver
查看>>
SpringMvc-PropertyEditor接口和@InitBinder注解
查看>>
Quartz-集群
查看>>