컨트롤과 알트키를 자주 자용하는 프로그램의 경우 윈도우키 개짜증나니까
비활성화 기본에 토글 처리 할수 있어야한다. (다음과 같이 처리)
1. 먼저 메인폼에 다음내역을 기제
#region '윈도우키 비활성화'
[DllImport("user32.dll")]
static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc callback, IntPtr hInstance, uint threadId);
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool UnhookWindowsHookEx(IntPtr hhk);
[DllImport("user32.dll")]
static extern IntPtr CallNextHookEx(IntPtr idHook, int nCode, int wParam, IntPtr lParam);
[DllImport("kernel32.dll")]
static extern IntPtr LoadLibrary(string lpFileName);
private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);
const int WH_KEYBOARD_LL = 13;
const int WM_KEYDOWN = 0x100;
private LowLevelKeyboardProc _proc = hookProc;
private static IntPtr hhook = IntPtr.Zero;
public void SetHook() { IntPtr hInstance = LoadLibrary("User32"); hhook = SetWindowsHookEx(WH_KEYBOARD_LL, _proc, hInstance, 0); bDisabledLWinKey=true; }
public static void UnHook() { UnhookWindowsHookEx(hhook); bDisabledLWinKey=false; }
public static IntPtr hookProc(int code, IntPtr wParam, IntPtr lParam)
{
if (code >= 0 && wParam == (IntPtr)WM_KEYDOWN)
{
int vkCode = Marshal.ReadInt32(lParam);
if (vkCode == 91)
return (IntPtr)1;
else
return CallNextHookEx(hhook, code, (int)wParam, lParam);
}
else
return CallNextHookEx(hhook, code, (int)wParam, lParam);
}
public static bool bDisabledLWinKey;
#endregion
2. 그리고나서 SetHook이나 UnHook함수를 호출하면서 활성 비활성하면됨
키보드후킹을 위해서 SetWindowsHookEx로 먼저 키를인지한상태에서
키코드가 91(왼쪽윈도우) 면 리턴해버리고 아니면 다음처리를 이어가도록함
3. 뭐.. 폼로드에 SetHook하고 폼클로즈에 UnHook하거나 키버튼으로
상호전환하거나 그러면 되겠지..
댓글 없음:
댓글 쓰기