Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用c禁用键盘#_C#_Keyboard_Shortcuts - Fatal编程技术网

C# 使用c禁用键盘#

C# 使用c禁用键盘#,c#,keyboard,shortcuts,C#,Keyboard,Shortcuts,我正在写一个程序,这是一个网络浏览器和禁用所有的键盘快捷键和键。它正在工作,但并不完美。我找到了一个获取代码的线程: 我的问题是: 每次我打开程序,首先我必须在窗口中单击或使用快捷方式,然后再次在窗口中单击。在那之后,它就起作用了。但当我打开它时它必须工作,所以我不必点击两次 有人有主意吗 干杯 编辑:好的。我试图用另一种方式解释我的问题: 首先我打开程序。然后我应该不能按任何键,如Win+Tab等,但我仍然可以按这些键。然后,如果我在程序窗口中单击,按一个键,然后再次单击窗口,它就会工作。但

我正在写一个程序,这是一个网络浏览器和禁用所有的键盘快捷键和键。它正在工作,但并不完美。我找到了一个获取代码的线程:

我的问题是: 每次我打开程序,首先我必须在窗口中单击或使用快捷方式,然后再次在窗口中单击。在那之后,它就起作用了。但当我打开它时它必须工作,所以我不必点击两次

有人有主意吗

干杯

编辑:好的。我试图用另一种方式解释我的问题:

首先我打开程序。然后我应该不能按任何键,如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);
        }
    }
}
我希望你现在明白我的意思
为所有有同样问题的人干杯,我得到了解决方案:

你只需要把
键盘挂钩(这个,e)
表单1\u Load()
中。因此
Form1\u Load()
现在应该如下所示:

private void Form1_Load(object sender, EventArgs e)
{
    this.WindowState = FormWindowState.Maximized;
    KeyboardHook(this, e);
}
原因:每次程序启动时,在我们放入
KeyboardHook(这个,e)之前,它应该阻止所有组合,如Alt+F4等进入
表单1_Load()
,如果在
webBrowser1

webBrowser1\u PreviewKeyDown(对象发送方,PreviewKeyDownEventArgs e)

如果您将其放入
Form1_Load(),它立即开始阻止组合

当然,这不适用于
Win+L
Ctrl+Alt+Del
,因为它们是热键

我希望我能帮助所有有同样问题的人:)


干杯

希望在任何时候都能在无障碍性问题上获得成功吗?为什么?也许我应该把重点放在webbrowser1上。但是.Focus()不起作用:/这可能会有帮助,也许谢谢你。我会看看它,然后告诉你这仍然帮不了我:/Mh。也许我可以把焦点放在webbrowser中的链接上。我必须测试一下。但程序仍然不能像我想要的那样工作…谢谢你们,你们今天帮助了我:pI急需为我的桌面应用程序禁用键盘。我在这里登陆,尝试了您的代码,但在第一次按键时,它在LowLevelKeyboardProcDelegate::Invoke上抛出“CallbackOnCollectedDelegate”异常:(解决方案是创建一个静态变量来保存LowLevelKeyboardProcDelegate的实例,而不是将“new LowLevelKeyboardProcDelegate…”传递给SetWindowsHookEx()顺便说一句,非常努力!竖起大拇指!