아래 코드는 모든 키보드 단축키를 차단합니다. 이후로 나는 이것을 메인 어플리케이션에 구현하려고했다. 아래 코드에서 .dll을 만들었습니다. .dll을 기본 응용 프로그램에 대한 참조로 포함시킨 후 응용 프로그램을 시작했습니다. 처음부터 잘 작동합니다. 그럼 내가 다른 물건을하고 shorcut를 확인하면 내 .dll이 내 응용 프로그램의 .exe가 종료 될 때까지 항상 수행해야합니다.문제 .dll을 C# Windows 응용 프로그램에 참조하는 중
내 .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);
}
}
}