簡體   English   中英

使用C#禁用鍵盤

[英]Disable keyboard using c#

我正在編寫一個程序,它是一個網絡瀏覽器,並禁用了所有鍵盤快捷鍵和按鍵。 它正在工作,但並不完美。 我在找到代碼的地方找到了一個線程:

使用C#阻止快捷鍵

我的問題是:每次我打開程序時,首先我必須在窗口中單擊或使用快捷方式,然后再次在窗口中單擊。 然后,它起作用了。 但是當我打開它時它必須工作,所以我不必單擊兩次...

有人知道嗎?

干杯

編輯:好的。 我嘗試用另一種方式解釋我的問題:

首先,我打開程序。 然后我應該不能按Win + Tab等任何鍵。但是我仍然可以按鍵。 然后,如果我在程序窗口中單擊,請按一個鍵,然后再次在窗口中單擊,它將起作用。 但是我希望該程序在打開時能正常運行,所以我不必先在窗口中單擊。 我在這里有一些代碼:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Diagnostics;

namespace Browser
{
    public partial class Form1 : Telerik.WinControls.UI.RadForm
    {
        public Form1()
        {
            InitializeComponent();
        }

        private delegate int LowLevelKeyboardProcDelegate(int nCode, int
           wParam, ref KBDLLHOOKSTRUCT lParam);

        [DllImport("user32.dll", EntryPoint = "SetWindowsHookExA", CharSet = CharSet.Ansi)]
        private static extern int SetWindowsHookEx(
           int idHook,
           LowLevelKeyboardProcDelegate lpfn,
           int hMod,
           int dwThreadId);

        [DllImport("user32.dll")]
        private static extern int UnhookWindowsHookEx(int hHook);

        [DllImport("user32.dll", EntryPoint = "CallNextHookEx", CharSet = CharSet.Ansi)]
        private static extern int CallNextHookEx(
            int hHook, int nCode,
            int wParam, ref KBDLLHOOKSTRUCT lParam);

        const int WH_KEYBOARD_LL = 13;
        private int intLLKey;
        private KBDLLHOOKSTRUCT lParam;

        private struct KBDLLHOOKSTRUCT
        {
            public int vkCode;
            int scanCode;
            public int flags;
            int time;
            int dwExtraInfo;
        }

        private int LowLevelKeyboardProc(
            int nCode, int wParam,
            ref KBDLLHOOKSTRUCT lParam)
        {
            bool blnEat = false;
            switch (wParam)
            {
                case 256:
                case 257:
                case 260:
                case 261:
                    //Alt+Tab, Alt+Esc, Ctrl+Esc, Windows Key
                    if (((lParam.vkCode == 9) && (lParam.flags == 32)) ||
                    ((lParam.vkCode == 27) && (lParam.flags == 32)) || ((lParam.vkCode ==
                    27) && (lParam.flags == 0)) || ((lParam.vkCode == 91) && (lParam.flags
                    == 1)) || ((lParam.vkCode == 92) && (lParam.flags == 1)) || ((true) &&
                    (lParam.flags == 32)))
                    {
                        blnEat = true;
                    }
                    break;
            }

            if (blnEat)
                return 1;
            else return CallNextHookEx(0, nCode, wParam, ref lParam);

        }

        private void KeyboardHook(object sender, EventArgs e)
        {
            intLLKey = SetWindowsHookEx(WH_KEYBOARD_LL, new LowLevelKeyboardProcDelegate(LowLevelKeyboardProc),
                       System.Runtime.InteropServices.Marshal.GetHINSTANCE(
                       System.Reflection.Assembly.GetExecutingAssembly().GetModules()[0]).ToInt32(), 0);
        }

        private void ReleaseKeyboardHook()
        {
            intLLKey = UnhookWindowsHookEx(intLLKey);
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            this.WindowState = FormWindowState.Maximized;
        }

        private void webBrowser1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
        {
            KeyboardHook(this, e);
        }
    }
}

我希望你知道我現在的意思

對於所有有相同問題的人,我都有解決方案:

您只需要放入KeyboardHook(this, e); Form1_Load() 因此, Form1_Load()現在應如下所示:

private void Form1_Load(object sender, EventArgs e)
{
    this.WindowState = FormWindowState.Maximized;
    KeyboardHook(this, e);
}

原因:每次程序啟動時,它都應阻止所有組合,例如Alt + F4等KeyboardHook(this, e); 進入Form1_Load(); ,如果在webBrowser1按下了某個鍵,該程序只會阻止這些鍵的組合

webBrowser1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)

如果將其放入Form1_Load(); ,它將立即開始阻止組合。

當然,這不適用於Win+LCtrl+Alt+Del因為它們是熱鍵。

希望我能對遇到同樣問題的所有人有所幫助:)

干杯

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM