2024년 9월 5일 목요일

c#에서 윈폼,wpf에서 윈도우키 비활성화 처리

컨트롤과 알트키를 자주 자용하는 프로그램의 경우 윈도우키 개짜증나니까 
비활성화 기본에 토글 처리 할수 있어야한다. (다음과 같이 처리)  


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하거나 키버튼으로
상호전환하거나 그러면 되겠지..

댓글 없음:

댓글 쓰기