问题引用.dll到c#windows应用程序

时间:2009-07-28 07:21:56

标签: c#

以下代码将阻止所有键盘快捷键。因为我想在我的主应用程序中实现它。我从下面的代码中创建了一个.dll。 在我将.dll作为对我的主应用程序的引用后,我启动了该应用程序。 它在开始时运作良好。然后,如果我做了一些其他的东西,然后检查shorcut,它没有被禁用,我的.dll必须始终做,直到我的主应用程序的.exe被终止。

为什么我的.dll在一段时间后没有禁用快捷方式?

从Program.cs调用.dll的源代码:


using DisableHotKeys;


public static class Program
{  
    public static DisableKeys disableKeysInstance = new DisableKeys(); 

    [STAThread]
    static void Main()
    {
        disableKeysInstance.DisableKeyboardHook();
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(Screensaver.ScreensaverRef); 
    }

}

.dll的源代码:


namespace DisableHotKeys
{

    public class DisableKeys
    {
        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 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);
        }
        public void DisableKeyboardHook()
        {
            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);
        } 
    } 
}

1 个答案:

答案 0 :(得分:0)

您的应用程序还有哪些其他代码?

当使用WH_KEYBOARD_LL时,系统需要您的钩子来处理它在特定时间范围内(在注册表中指定:KEY_CURRENT_USER\Control Panel\Desktop\LowLevelHooksTimeout)获取的消息 - 如果它不能这样做,系统将简单地调用链中的下一个钩子。因此,请确保您拥有的其他任何代码都是以最高优先级发送消息。

尝试设置注册表值并测试是否有帮助 - 如果知道您的代码需要更快地响应挂钩开关。