C# 핫키 설정 RegisterHotKey

윈도우 어떤 곳에서든(내 프로그램이 비활성 이더라도) 반응하는 핫키 입니다.

흐름은,

 

선언 -> 호출(등록) -> WndProc 오버라이딩(핫키 처리)

 

 

상황 설정:

폼 로드시 F5, F6이 핫키로 등록되고 종료시 해제된다.

F5키가 눌러지면 시작버튼을, F6은 중지버튼을 누르도록 처리한다.

 

 

//핫키등록
[DllImport("user32.dll")]
private static extern int RegisterHotKey(int hwnd, int id, int fsModifiers, int vk);

//핫키제거
[DllImport("user32.dll")]
private static extern int UnregisterHotKey(int hwnd, int id);

private void Form1_Load(object sender, EventArgs e)
{
    RegisterHotKey((int)this.Handle, 0, 0x0, (int)Keys.F5); //(여기로가져와, 니 ID는 0이야, 조합키안써, F5눌러지면)
                                                            // 0x1은 알트, 0x2는 콘트롤, 0x3은 쉬프트
    
    RegisterHotKey((int)this.Handle, 1, 0x0, (int)Keys.F6); 
}

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    UnregisterHotKey((int)this.Handle, 0); //이 폼에 ID가 0인 핫키 해제
    UnregisterHotKey((int)this.Handle, 1);
}

protected override void WndProc(ref Message m) //윈도우프로시저 콜백함수
{
    base.WndProc(ref m);
			
    if (m.Msg == (int)0x312) //핫키가 눌러지면 312 정수 메세지를 받게됨
    {
        if (m.WParam == (IntPtr)0x0) // 그 키의 ID가 0이면
        {
            시작버튼.PerformClick();
        }
        if (m.WParam == (IntPtr)0x1) // 그 키의 ID가 1이면
        {
            중지버튼.PerformClick();
        }
    }
}

 

 

고려해야 할 사항은,

핫키가 등록되는 즉시,

핫키에 지정된 핸들외에 다른 프로그램들은 해당 키의 입력을 전달받지 못합니다.

익스플로러에서 F5는 '새로고침'이지만 F5를 핫키로 등록했다면

F5를 눌러도 '새로고침'이란 기능이 실행되지 않습니다.

 

상황에 따라서 의도적으로 이용하거나 신경쓰지 않아도 되겠지만 

그렇지 않다면 다른프로그램의 단축키를 피해서 설정하거나 키입력을 다시 돌려주는 등의 해결방안을 신경써야합니다.

 

 

'.NET > WinAPI' 카테고리의 다른 글

C# 키보드이벤트  (0) 2014.01.19
C# 마우스이벤트  (0) 2014.01.18
C# 윈도우 위치,크기 정보얻기 GetWindowPlacement  (0) 2014.01.06
C# 윈도우핸들 얻기 FindWindow  (0) 2013.12.20
C#에 Windows API 사용하기  (0) 2013.12.19