using System.Runtime.InteropServices; namespace WinFormsApp2 { public partial class Form1 : Form { // Windows API 선언 (user32.dll) [DllImport("user32.dll")] private static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vk);
[DllImport("user32.dll")] private static extern bool UnregisterHotKey(IntPtr hWnd, int id);
// 상수 정의 private const int WM_HOTKEY = 0x0312; // 핫키 메시지 식별자 private const int HOTKEY_ID = 9000; // 핫키 고유 ID (개발자 임의 지정) // 가상 키 코드 (F7 = 0x76) private const int VK_F7 = 0x76; // 조합 키 플래그 (없음 = 0x0000) private const int MOD_NONE = 0x0000; private bool isButtxxonClicked = false; // 버튼 클릭 여부 플래그 private bool isHotKeyRegistered = false; private NotifyIcon trayIcon; // 시스템 트레이 아이콘 변수
public Form1() { InitializeComponent(); InitTrayIcon(); // 트레이 아이콘 초기화 }
// 1. [핵심] 핸들이 새로 생성되거나 변경될 때 자동으로 단축키를 다시 등록하는 메서드 protected override void OnHandleCreated(EventArgs e) { base.OnHandleCreated(e); // 사용자가 버튼을 클릭한 이후에만 단축키를 등록하도록 제어 if (isButtxxonClicked) { RegisterGlobalHotKey(); } }
// 2. 단축키 실제 등록 로직 private void RegisterGlobalHotKey() { // 기존 등록이 남아있을 수 있으므로 안전하게 해제 후 재등록 UnregisterHotKey(this.Handle, HOTKEY_ID); bool success = RegisterHotKey(this.Handle, HOTKEY_ID, MOD_NONE, VK_F7); if (!success) { MessageBox.Show("단축키 등록 실패 (이미 사용 중인 단축키)"); } }
// 3. 버튼 클릭 시 상태 변경 및 폼 숨기기 private void button1_Click(object sender, EventArgs e) { if (!isButtxxonClicked) { isButtxxonClicked = true; // 단축키 등록 실행 RegisterGlobalHotKey(); // 트레이 아이콘 활성화 및 폼 완전히 숨기기 (이 과정에서 핸들이 재생성됨) trayIcon.Visible = true; this.WindowState = FormWindowState.Minimized; this.ShowInTaskbar = false; this.Hide(); trayIcon.ShowBalloonTip(2000, "프로그램 숨김", "백그라운드에서 실행 중입니다.\n바탕화면 등 어디서나 [F7]을 누르면 메시지가 출력됩니다.", ToolTipIcon.Info); } }
// 4. 시스템 전역 키 입력 감지 (바탕화면, 타 프로그램 포함) protected override void WndProc(ref Message m) { base.WndProc(ref m); if (m.Msg == WM_HOTKEY && m.WParam.ToInt32() == HOTKEY_ID) { MessageBox.Show("바탕화면(백그라운드)에서 [F7] 키가 정상 감지되었습니다!", "알림", MessageBoxButtons.OK, MessageBoxIcon.Information); } }