c#禁用最小化和还原按钮

http://blog.sina.com.cn/s/blog_742925320100plhw.html

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

        }

其实禁用最小化按钮,只要在窗口的属性里把maximumBox属性设置为false就行了。


    下面是禁用快捷键的方法:

 先写一个钩子的公用类,代码如下:


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头文件中!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值