日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > C# >内容正文

C#

C# winform 禁用最小化和还原按钮(消息循环截获处理)

發(fā)布時(shí)間:2023/12/18 C# 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C# winform 禁用最小化和还原按钮(消息循环截获处理) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

項(xiàng)目中遇到一些問(wèn)題,需要根據(jù)權(quán)限配置去控制用戶對(duì)系統(tǒng)平臺(tái)是否可以最小化和還原窗口大小的操作,并且屏蔽系統(tǒng)的一些快捷鍵,比如:alt+F4,windows鍵,任務(wù)管理器等一些操作,代碼如下:

(禁止窗口最小化和還原(窗口啟動(dòng)之后為最大化))

偷梁換柱(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)//點(diǎn)擊最小化
{

//還可以做些其它的操作
m.WParam = (IntPtr)SC_MAXIMIZE;
}
if (m.WParam.ToInt32() == SC_NOMAL)//點(diǎn)擊還原
{

    //還可以做些點(diǎn)還原按鈕時(shí)其它的操作

m.WParam = (IntPtr)SC_MAXIMIZE;
}
base.WndProc(ref m);

}

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

先寫一個(gè)鉤子的公用類,代碼如下:


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; // 用流來(lái)屏蔽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 對(duì)應(yīng)COM的函數(shù)

[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);

//?繼續(xù)下一個(gè)鉤子

[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>
/// 啟動(dòng)鉤子
/// </summary>
public void HookStart()
{
if (hKeyboardHook == 0)
{
//?創(chuàng)建HookProc實(shí)例

KeyboardHookProcedure = new HookProc(KeyboardHookProc);

hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD,
KeyboardHookProcedure,
Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]),
0);

//?如果設(shè)置鉤子失敗

if (hKeyboardHook == 0)
{
HookStop();
}

//用二進(jìn)制流的方法打開(kāi)任務(wù)管理器。而且不關(guān)閉流.這樣任務(wù)管理器就打開(kāi)不了
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;//鍵盤的狀態(tài)
}

#endregion

?

}
}

再在窗口Load事件調(diào)用就OK了,關(guān)閉的時(shí)候一定要卸載鉤子,要不鍵盤快捷鍵還是不能用!

還需了解一些windows消息機(jī)制,消息數(shù)值在winuser.h頭文件中!

總結(jié)

以上是生活随笔為你收集整理的C# winform 禁用最小化和还原按钮(消息循环截获处理)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。