使用全屏 winform C# 我需要忽略所有用户输入 [重复]

Posted

技术标签:

【中文标题】使用全屏 winform C# 我需要忽略所有用户输入 [重复]【英文标题】:Using a Fullscreen winform C# I need to ignore all user input [duplicate] 【发布时间】:2021-07-03 13:42:37 【问题描述】:

我有一个全屏显示的仪表板。希望使其更像是用户无法轻松绕过以进入桌面的“信息亭”视图。更多用于日常防篡改。我在右上角有一个按钮,用于显示我想要保持启用状态并允许输入 pin 以关闭应用程序的菜单。

是否有我应该查看的函数调用或库来阻止用户活动,或者我是否只需将所有控件设置为 enable=false 等?但他们仍然可以点击我也想阻止的 Windows 或 Ctrl+Alt+Delete。

【问题讨论】:

Windows 有一个内置的“kiosk 模式”。见docs.microsoft.com/en-us/windows/configuration/kiosk-single-app IIRC 你不能在你的应用程序中绕过 C-A-D,因为操作系统会先于其他任何东西来获取它。可能有一个组策略设置可以使用,我不记得了。 正确,您无法绕过 C-A-D,即使在 Kiosk 模式下也不行。 【参考方案1】:

创建一个 FormClosing 属性并编写以下代码以禁用用户关闭表单。

private void FormName_FormClosing(object sender, FormClosingEventArgs e)
        
            e.Cancel = (e.CloseReason == CloseReason.UserClosing);
        

如果您想更进一步并禁用功能键示例,我还有以下代码 (from here)。 ctrl+shift+esc(打开任务管理器)等

把这个放到FormName_Load中

ProcessModule objCurrentModule = Process.GetCurrentProcess().MainModule;
            objKeyboardProcess = new LowLevelKeyboardProc(captureKey);
            ptrHook = SetWindowsHookEx(13, objKeyboardProcess, GetModuleHandle(objCurrentModule.ModuleName), 0);

然后把这个放在public partial class FormName : Form

/* Code to Disable WinKey, Alt+Tab, Ctrl+Shift+Esc Starts Here */

        // Structure contain information about low-level keyboard input event 
        [StructLayout(LayoutKind.Sequential)]
        private struct KBDLLHOOKSTRUCT
        
            public Keys key;
            public int scanCode;
            public int flags;
            public int time;
            public IntPtr extra;
        
        //System level functions to be used for hook and unhook keyboard input  
        private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);
        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern IntPtr SetWindowsHookEx(int id, LowLevelKeyboardProc callback, IntPtr hMod, uint dwThreadId);
        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern bool UnhookWindowsHookEx(IntPtr hook);
        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern IntPtr CallNextHookEx(IntPtr hook, int nCode, IntPtr wp, IntPtr lp);
        [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern IntPtr GetModuleHandle(string name);
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        private static extern short GetAsyncKeyState(Keys key);
        //Declaring Global objects     
        private IntPtr ptrHook;
        private LowLevelKeyboardProc objKeyboardProcess;

        private IntPtr captureKey(int nCode, IntPtr wp, IntPtr lp)
        
            if (nCode >= 0)
            
                KBDLLHOOKSTRUCT objKeyInfo = (KBDLLHOOKSTRUCT)Marshal.PtrToStructure(lp, typeof(KBDLLHOOKSTRUCT));

                // Disabling Windows keys 

                if (objKeyInfo.key == Keys.RWin || objKeyInfo.key == Keys.LWin || objKeyInfo.key == Keys.Tab && HasAltModifier(objKeyInfo.flags) || objKeyInfo.key == Keys.Escape && (ModifierKeys & Keys.Control) == Keys.Control)
                
                    return (IntPtr)1; // if 0 is returned then All the above keys will be enabled
                
            
            return CallNextHookEx(ptrHook, nCode, wp, lp);
        

        bool HasAltModifier(int flags)
        
            return (flags & 0x20) == 0x20;
        

        /* Code to Disable WinKey, Alt+Tab, Ctrl+Shift+Esc Ends Here */

确保你也在使用这些

using System;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Diagnostics;
using System.IO;

系统诊断;和 System.Runtime.InteropServices;具体一点。

通过这些更改,我建议您进行“紧急逃生”,以防您想退出。

您也可以将应用程序置于启动状态,以便在机器登录后启动。 代码:

if (File.Exists(Environment.GetFolderPath(Environment.SpecialFolder.Startup).Trim() + "\\FILE.exe") == false)
                
                    File.Move(Application.StartupPath + "\\FILE.exe", Environment.GetFolderPath(Environment.SpecialFolder.Startup).Trim() + "\\FILE.exe");
                

如果已经在启动中的文件引发异常,我建议将其设为 try catch 语句

【讨论】:

你应该链接到where you got that code from。始终给出适当的归属。 见license @Amy 我不记得它在我的一个项目中来自哪里 我们都有责任为我们在网上找到的代码保留出处,尤其是当我们获得它的许可证需要它时,尤其是当它在我们正在处理的代码中时为我们的雇主。这不是借口。添加评论说“此代码来自...”很容易 @Amy 是的,很抱歉我只是把它放在一边,因为我不倾向于在代码附近发表评论,但我会在应用程序的特殊部分发表评论或制作自述文件以感谢和提及代码创建者/来源。我刚刚找到了我的项目文件。

以上是关于使用全屏 winform C# 我需要忽略所有用户输入 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

C#把winform中的Panel控件部分全屏

从 C# winforms 执行批处理文件忽略超时

在C#中如何实现winform窗体的全屏截图功能

C# WinForm 实现全屏效果

C# - 为啥全屏 Winform 应用程序不总是覆盖任务栏?

如何使用c#在winforms中为每个用户授予权限