Der folgende Code wird alle Tastenkombinationen blockieren. Da ich das in meiner Hauptanwendung implementieren wollte. Ich habe eine DLL aus dem folgenden Code erstellt. Nachdem ich die .dll als Referenz zu meiner Hauptanwendung hinzugefügt habe, habe ich die Anwendung gestartet. Es funktioniert am Anfang gut. Dann, wenn ich einige andere Sachen mache und dann den Shorcut überprüfe, ist es nicht deaktiviert, was meine .dll immer tun muss, bis die .exe für meine Hauptanwendung beendet wird.Problem Referenzieren von .dll zu C# Windows-Anwendung
Warum deaktiviert meine .dll die Verknüpfungen nicht nach einiger Zeit?
Quellcode für den Aufruf von DLL von Program.cs:
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);
}
}
Quellcode der 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);
}
}
}