亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C#實(shí)現(xiàn)WinForm全屏置頂?shù)氖纠a

 更新時(shí)間:2024年12月02日 09:38:39   作者:初九之潛龍勿用  
我們?cè)谶\(yùn)行一些?Windows?應(yīng)用程序的時(shí)候,需要將其運(yùn)行在窗體置頂?shù)哪J?并且進(jìn)入全屏狀態(tài),本文將介紹如何使用?C#?來(lái)實(shí)現(xiàn)?WinForm?的全屏置頂?shù)幕竟δ?感興趣的可以了解下

應(yīng)用需求

我們?cè)谶\(yùn)行一些 Windows 應(yīng)用程序的時(shí)候,需要將其運(yùn)行在窗體置頂?shù)哪J剑ㄊ蛊渌鼞?yīng)用窗體無(wú)法遮擋在置頂應(yīng)用窗體之上),并且進(jìn)入全屏狀態(tài)。本文將介紹如何使用 C# 來(lái)實(shí)現(xiàn) WinForm 的全屏置頂?shù)幕竟δ堋?/p>

基本功能主要實(shí)現(xiàn)以下幾點(diǎn):

(1)改變WinForm的一些外觀屬性,包括無(wú)邊框、最大化和置頂屬性。

(2)屏蔽一些鍵盤(pán)操作,以阻止關(guān)閉應(yīng)用程序或切換到其它的應(yīng)用程序?;究梢云帘巫笥襑IN菜單鍵、關(guān)閉窗口組合鍵(Alt+F4)、切換窗口組合鍵(Alt+Tab)、開(kāi)始菜單鍵(Ctrl+Esc)。

設(shè)計(jì)

設(shè)計(jì) CraneofficeWinLock 類,該類可以實(shí)現(xiàn)一些方法,自動(dòng)設(shè)置 WinForm 的一些屬性、屏蔽一些鍵盤(pán)操作,其主要設(shè)計(jì)如下表:

序號(hào)名稱成員類型類型說(shuō)明
1form屬性System.Windows.Forms指定要自動(dòng)設(shè)置屬性的窗體
2OnKeyPress方法void處理屏蔽鍵盤(pán)操作的方法
3Start方法void主入口方法,啟動(dòng)程序,需要傳遞OnKeyPress方法句柄
4Stop方法void停止所有屏蔽操作

范例運(yùn)行環(huán)境

操作系統(tǒng): Windows 11、Windows 10 、Windows 2019 Server 

.net版本: .netFramework4.7.2 或以上

開(kāi)發(fā)工具:VS2019  C#

運(yùn)行設(shè)備:Microsoft Surface Pro

實(shí)現(xiàn)代碼

核心代碼

代碼如下:

   public class CraneofficeWinLock
    {
        private const int WH_KEYBOARD_LL = 13; //鍵盤(pán)
        public Form form = null;
        private delegate int HookHandle(int nCode, int wParam, IntPtr lParam);
        public delegate void ProcessKeyHandle(HookStruct param, out bool handle);
        private static int _hHookValue = 0;
        private HookHandle _KeyBoardHookProcedure;
        [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);
        [DllImport("kernel32.dll")]
        private static extern int GetCurrentThreadId();
        [DllImport("kernel32.dll")]
        private static extern IntPtr GetModuleHandle(string name);
 
        private IntPtr _hookWindowPtr = IntPtr.Zero;
        public CraneofficeWinLock() { }
        private static ProcessKeyHandle _clientMethod = null;
        public void Start(ProcessKeyHandle clientMethod)
        {
            if (form != null)
            {
                form.WindowState = FormWindowState.Maximized;
                form.FormBorderStyle = FormBorderStyle.None;
                form.TopMost = true;
            }
            _clientMethod = clientMethod;
            if (_hHookValue == 0)
            {
                _KeyBoardHookProcedure = new HookHandle(OnHookProc);
 
                _hookWindowPtr = GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName);
 
                _hHookValue = SetWindowsHookEx(
                WH_KEYBOARD_LL,
                _KeyBoardHookProcedure,
                _hookWindowPtr,
                0);
 
                //如果設(shè)置鉤子失敗.
                if (_hHookValue == 0) Stop();
            }
        }
        public void Stop()
        {
            if (_hHookValue != 0)
            {
                bool ret = UnhookWindowsHookEx(_hHookValue);
                if (ret) _hHookValue = 0;
            }
        }
        private static int OnHookProc(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:表示鍵盤(pán),return 退出
                }
            }
            return CallNextHookEx(_hHookValue, nCode, wParam, lParam);
        }
        public void OnKeyPress(CraneofficeWinLock.HookStruct hookStruct, out bool handle)
        {
 
            handle = false;
            if (hookStruct.vkCode == 91) // 左win(開(kāi)始菜單鍵)
            {
                handle = true;
            }
            if (hookStruct.vkCode == 92)// 右win
            {
                handle = true;
            }
 
            if (hookStruct.vkCode == (int)Keys.Escape && (int)Control.ModifierKeys == (int)Keys.Control)
            {
                handle = true;
            }
            if (hookStruct.vkCode == (int)Keys.F4 && (int)Control.ModifierKeys == (int)Keys.Alt)
            {
                handle = true;
            }
            if (hookStruct.vkCode == (int)Keys.Tab && (int)Control.ModifierKeys == (int)Keys.Alt)
            {
                handle = true;
            }
            if (hookStruct.vkCode == (int)Keys.F1)
            {
                handle = true;
            }
 
            Keys key = (Keys)hookStruct.vkCode;
 
        }
 
    }

調(diào)用示例

示例代碼如下:

private CodnHBuilder.CraneofficeWinLock _winlock = null;
 
private void Form1_Load(object sender, EventArgs e)
{
     _winlock = new CodnHBuilder.CraneofficeWinLock();
     _winlock.form = this;
     _winlock.Start(_winlock.OnKeyPress);
}

小結(jié)

我們可以在退出代碼中停止屏蔽的操作,如下代碼:

if (_winlock != null) _winlock.Stop();
Application.Exit();

另外,為防止一些其它未考慮的情況,比較懶,寫(xiě)了一個(gè)計(jì)時(shí)器(時(shí)長(zhǎng)1000毫秒)代碼,實(shí)時(shí)激活窗體的狀態(tài),以保持窗體永遠(yuǎn)在最上層,如下代碼:

private void timer1_Tick(object sender, EventArgs e)
{
     this.Activate();
}

到此這篇關(guān)于C#實(shí)現(xiàn)WinForm全屏置頂?shù)氖纠a的文章就介紹到這了,更多相關(guān)C# WinForm全屏置頂內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 在C#項(xiàng)目中如何使用NHibernate詳解

    在C#項(xiàng)目中如何使用NHibernate詳解

    NHibernate的設(shè)計(jì)思想和Hibernate的設(shè)計(jì)思想基本相同,都是為了避免頻繁的編寫(xiě)sql腳本,使用面向?qū)ο蟮姆绞绞褂胔ql語(yǔ)句進(jìn)行查詢。下面這篇文章主要給大家介紹了關(guān)于在C#項(xiàng)目中如何使用NHibernate的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-04-04
  • C#中ManualResetEvent用法總結(jié)

    C#中ManualResetEvent用法總結(jié)

    這篇文章主要介紹了C#中ManualResetEvent用法總結(jié),幫助大家更好的理解和使用c#,感興趣的朋友可以了解下
    2021-01-01
  • C# MVC 微信支付教程系列之公眾號(hào)支付代碼

    C# MVC 微信支付教程系列之公眾號(hào)支付代碼

    本篇文章主要介紹了C# MVC 微信支付教程系列之公眾號(hào)支付代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-12-12
  • WinForm實(shí)現(xiàn)為ComboBox綁定數(shù)據(jù)源并提供下拉提示功能

    WinForm實(shí)現(xiàn)為ComboBox綁定數(shù)據(jù)源并提供下拉提示功能

    這篇文章主要介紹了WinForm實(shí)現(xiàn)為ComboBox綁定數(shù)據(jù)源并提供下拉提示功能,是非常實(shí)用的功能,需要的朋友可以參考下
    2014-08-08
  • C#實(shí)現(xiàn)一鍵換IP、重置DNS、網(wǎng)關(guān)及掩碼的方法

    C#實(shí)現(xiàn)一鍵換IP、重置DNS、網(wǎng)關(guān)及掩碼的方法

    這篇文章主要介紹了C#實(shí)現(xiàn)一鍵換IP、重置DNS、網(wǎng)關(guān)及掩碼的方法,很實(shí)用的功能,需要的朋友可以參考下
    2014-07-07
  • C#各類集合匯總

    C#各類集合匯總

    這篇文章主要介紹了C#各類集合的相關(guān)資料,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • 詳解C#調(diào)用matlab生成的dll庫(kù)

    詳解C#調(diào)用matlab生成的dll庫(kù)

    這篇文章主要介紹了C#調(diào)用matlab生成的dll庫(kù),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-09-09
  • C#實(shí)現(xiàn)加密bat文件的示例詳解

    C#實(shí)現(xiàn)加密bat文件的示例詳解

    這篇文章主要為大家詳細(xì)介紹了C#如何實(shí)現(xiàn)加密bat文件的功能,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-01-01
  • C#實(shí)現(xiàn)UDP通信方式

    C#實(shí)現(xiàn)UDP通信方式

    文章介紹了如何使用C#實(shí)現(xiàn)UDP通信,包括UDP服務(wù)器和客戶端的實(shí)現(xiàn)步驟和示例代碼,服務(wù)器關(guān)鍵類為UdpClient和IPEndPoint,實(shí)例化對(duì)象后可以通過(guò)異步任務(wù)發(fā)送數(shù)據(jù)并接收數(shù)據(jù),客戶端同樣使用UdpClient和IPEndPoint,連接到遠(yuǎn)程服務(wù)器后開(kāi)新任務(wù)接收數(shù)據(jù)
    2025-01-01
  • C#操作windows注冊(cè)表的方法

    C#操作windows注冊(cè)表的方法

    這篇文章主要介紹了C#操作windows注冊(cè)表的方法,涉及C#針對(duì)注冊(cè)表的讀取與寫(xiě)入技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-04-04

最新評(píng)論