C#实现WinForm全屏置顶的示例代码

 更新时间:2024年12月02日 09:38:39   作者:初九之潜龙勿用  
我们在运行一些 Windows 应用程序的时候,需要将其运行在窗体置顶的模式,并且进入全屏状态,本文将介绍如何使用 C# 来实现 WinForm 的全屏置顶的基本功能,感兴趣的可以了解下

应用需求

我们在运行一些 Windows 应用程序的时候,需要将其运行在窗体置顶的模式(使其它应用窗体无法遮挡在置顶应用窗体之上),并且进入全屏状态。本文将介绍如何使用 C# 来实现 WinForm 的全屏置顶的基本功能。

基本功能主要实现以下几点:

(1)改变WinForm的一些外观属性,包括无边框、最大化和置顶属性。

(2)屏蔽一些键盘操作,以阻止关闭应用程序或切换到其它的应用程序。基本可以屏蔽左右WIN菜单键、关闭窗口组合键(Alt+F4)、切换窗口组合键(Alt+Tab)、开始菜单键(Ctrl+Esc)。

设计

设计 CraneofficeWinLock 类,该类可以实现一些方法,自动设置 WinForm 的一些属性、屏蔽一些键盘操作,其主要设计如下表:

序号名称成员类型类型说明
1form属性System.Windows.Forms指定要自动设置属性的窗体
2OnKeyPress方法void处理屏蔽键盘操作的方法
3Start方法void主入口方法,启动程序,需要传递OnKeyPress方法句柄
4Stop方法void停止所有屏蔽操作

范例运行环境

操作系统: Windows 11、Windows 10 、Windows 2019 Server 

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

开发工具:VS2019  C#

运行设备:Microsoft Surface Pro

实现代码

核心代码

代码如下:

   public class CraneofficeWinLock
    {
        private const int WH_KEYBOARD_LL = 13; //键盘
        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);
 
                //如果设置钩子失败.
                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:表示键盘,return 退出
                }
            }
            return CallNextHookEx(_hHookValue, nCode, wParam, lParam);
        }
        public void OnKeyPress(CraneofficeWinLock.HookStruct hookStruct, out bool handle)
        {
 
            handle = false;
            if (hookStruct.vkCode == 91) // 左win(开始菜单键)
            {
                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;
 
        }
 
    }

调用示例

示例代码如下:

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

小结

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

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

另外,为防止一些其它未考虑的情况,比较懒,写了一个计时器(时长1000毫秒)代码,实时激活窗体的状态,以保持窗体永远在最上层,如下代码:

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

到此这篇关于C#实现WinForm全屏置顶的示例代码的文章就介绍到这了,更多相关C# WinForm全屏置顶内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用C#实现在Excel中高效生成和操作表格

    使用C#实现在Excel中高效生成和操作表格

    在日常工作中,Excel不仅仅是一个电子表格工具,它还提供了强大的表格功能,帮助我们高效地管理、分析和展示数据,随着数据量的增加,手动操作这些表格变得越来越繁琐,通过编程,我们可以自动化这些操作,利用C#在Excel中创建、管理和优化表格功能,需要的朋友可以参考下
    2025-11-11
  • 区分c# 前台和后台线程

    区分c# 前台和后台线程

    这篇文章主要介绍了c# 前台线程和后台线程的区别与联系,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • 在WPF中动态加载XAML中的控件实例代码

    在WPF中动态加载XAML中的控件实例代码

    这篇文章主要介绍了在WPF中动态加载XAML中的控件,实例分析了WPF中针对XAML中控件的动态调用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2016-07-07
  • C#中GraphicsPath的AddString方法用法实例

    C#中GraphicsPath的AddString方法用法实例

    这篇文章主要介绍了C#中GraphicsPath的AddString方法用法,实例分析了AddString方法添加字符串的相关使用技巧,需要的朋友可以参考下
    2015-06-06
  • c#中LINQ的基本用法(二)

    c#中LINQ的基本用法(二)

    这篇文章介绍了c#中LINQ的基本用法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下的相关资料
    2022-04-04
  • C#使用AutoMapper实现类映射详解

    C#使用AutoMapper实现类映射详解

    AutoMapper是一个用于.NET中简化类之间的映射的扩展库,这篇文章主要介绍了C#如何使用AutoMapper实现类映射,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-01-01
  • C#使用log4net结合sqlite数据库实现记录日志

    C#使用log4net结合sqlite数据库实现记录日志

    因为结构化的数据库存储的日志信息,可以写专门的软件读取历史日志信息,通过各种条件筛选,可操作性极大增强,有这方面需求的开发人员可以考虑,本文给大家介绍了C#使用log4net结合sqlite数据库记录日志,需要的朋友可以参考下
    2024-10-10
  • C#中面向对象编程机制之继承学习笔记

    C#中面向对象编程机制之继承学习笔记

    这篇文章主要介绍了C#中面向对象编程机制之继承学习笔记,本文给出一个简单子实例讲解C#中的继承,并讲解了一些C#继承的知识技巧,需要的朋友可以参考下
    2015-01-01
  • C#图片压缩的实现方法

    C#图片压缩的实现方法

    一般在web应用中,对客户端提交上来的图片肯定需要进行压缩的。尤其是比较大的图片,如果不经过压缩会导致页面变的很大,打开速度比较慢,当然了如果是需要高质量的图片也得需要生产缩略图。
    2013-02-02
  • List<>中Find的用法小结

    List<>中Find的用法小结

    本篇文章主要是对List<>中Find的用法进行了总结介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2014-01-01

最新评论