■ RegisterHotKey/UnregisterHotKey API 함수 : 전역 핫키 사용하기
------------------------------------------------------------------------------------------------------------------------
▶ MainWindow.xaml
<Window x:Class="TestProject.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Width="800" Height="600" Title="RegisterHotKey/UnregisterHotKey API 함수 : 전역 핫키 사용하기" FontFamily="나눔고딕코딩" FontSize="16"> <Grid> <TextBlock Name="textBlock" /> </Grid> </Window>
|
▶ MainWindow.xaml.cs
using System; using System.Runtime.InteropServices; using System.Windows; using System.Windows.Interop;
namespace TestProject { /// <summary> /// 메인 윈도우 /// </summary> public partial class MainWindow : Window { //////////////////////////////////////////////////////////////////////////////////////////////////// Import ////////////////////////////////////////////////////////////////////////////////////////// Static //////////////////////////////////////////////////////////////////////////////// Private
#region 핫키 등록하기 - RegisterHotKey(windowHandle, id, modifiers, virtualKey)
/// <summary> /// 핫키 등록하기 /// </summary> /// <param name="windowHandle">윈도우 핸들</param> /// <param name="id">ID</param> /// <param name="modifiers">수정자</param> /// <param name="virtualKey">가상 키</param> /// <returns>처리 결과</returns> [DllImport("user32.dll")] private static extern bool RegisterHotKey(IntPtr windowHandle, int id, uint modifiers, uint virtualKey);
#endregion #region 핫키 등록 취소하기 - UnregisterHotKey(windowHandle, id)
/// <summary> /// 핫키 등록 취소하기 /// </summary> /// <param name="windowHandle">윈도우 핸들</param> /// <param name="id">ID</param> /// <returns>처리 결과</returns> [DllImport("user32.dll")] private static extern bool UnregisterHotKey(IntPtr windowHandle, int id);
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Field ////////////////////////////////////////////////////////////////////////////////////////// Private
#region Field
/// <summary> /// HOTKEY_ID /// </summary> private const int HOTKEY_ID = 9000;
/// <summary> /// MODIFIER_NONE /// </summary> private const uint MODIFIER_NONE = 0x0000;
/// <summary> /// MODIFIER_ALT /// </summary> private const uint MODIFIER_ALT = 0x0001;
/// <summary> /// MODIFIER_CONTROL /// </summary> private const uint MODIFIER_CONTROL = 0x0002;
/// <summary> /// MODIFIER_SHIFT /// </summary> private const uint MODIFIER_SHIFT = 0x0004;
/// <summary> /// MODIFIER_WINDOWS /// </summary> private const uint MODIFIER_WINDOWS = 0x0008;
/// <summary> /// VK_CAPITAL /// </summary> /// <remarks>CAPS LOCK</remarks> private const uint VK_CAPITAL = 0x14;
/// <summary> /// WM_HOTKEY /// </summary> private const int WM_HOTKEY = 0x0312;
/// <summary> /// 윈도우 핸들 /// </summary> private IntPtr windowHandle;
/// <summary> /// 윈도우 핸들 소스 /// </summary> private HwndSource windowHandleSource;
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Constructor ////////////////////////////////////////////////////////////////////////////////////////// Public
#region 생성자 - MainWindow()
/// <summary> /// 생성자 /// </summary> public MainWindow() { InitializeComponent(); }
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Constructor ////////////////////////////////////////////////////////////////////////////////////////// Protected
#region 소스 초기화시 처리하기 - OnSourceInitialized(e)
/// <summary> /// 소스 초기화시 처리하기 /// </summary> /// <param name="e">이벤트 발생자</param> protected override void OnSourceInitialized(EventArgs e) { base.OnSourceInitialized(e);
this.windowHandle = new WindowInteropHelper(this).Handle;
this.windowHandleSource = HwndSource.FromHwnd(this.windowHandle);
this.windowHandleSource.AddHook(ProcessWindowHandleHooking);
RegisterHotKey(this.windowHandle, HOTKEY_ID, MODIFIER_CONTROL, VK_CAPITAL); }
#endregion #region 종료시 처리하기 - OnClosed(e)
/// <summary> /// 종료시 처리하기 /// </summary> /// <param name="e">이벤트 인자</param> protected override void OnClosed(EventArgs e) { this.windowHandleSource.RemoveHook(ProcessWindowHandleHooking);
UnregisterHotKey(this.windowHandle, HOTKEY_ID);
base.OnClosed(e); }
#endregion
////////////////////////////////////////////////////////////////////////////////////////// Public
#region 윈도우 핸들 후킹 처리하기 - ProcessWindowHandleHooking(windowHandle, message, wordParameter, longParameter, handled)
/// <summary> /// 윈도우 핸들 후킹 처리하기 /// </summary> /// <param name="windowHandle">윈도우 핸들</param> /// <param name="message">메시지</param> /// <param name="wordParameter">WORD 매개 변수</param> /// <param name="longParameter">LONG 매개 변수</param> /// <param name="handled">처리 여부</param> /// <returns>처리 결과</returns> private IntPtr ProcessWindowHandleHooking ( IntPtr windowHandle, int message, IntPtr wordParameter, IntPtr longParameter, ref bool handled ) { switch(message) { case WM_HOTKEY :
switch(wordParameter.ToInt32()) { case HOTKEY_ID :
int virtualKey = (((int)longParameter >> 16) & 0xffff);
if(virtualKey == VK_CAPITAL) { this.textBlock.Text += "CTRL+CAPS 키가 눌렸습니다." + Environment.NewLine; }
handled = true;
break; }
break; }
return IntPtr.Zero; }
#endregion } }
|
------------------------------------------------------------------------------------------------------------------------
'C# > WPF' 카테고리의 다른 글
[C#/WPF] Storyboard 엘리먼트 : WIPE 애니메이션 사용하기 (0) | 2021.01.22 |
---|---|
[C#/WPF] Decorator 클래스 : 그림자 효과 사용하기 (0) | 2021.01.20 |
[C#/WPF] MDI 폼 사용하기 (0) | 2021.01.20 |
[C#/WPF] DesignerProperties 클래스 : GetIsInDesignMode 정적 메소드를 사용해 디자인 모드 여부 구하기 (0) | 2021.01.17 |
[C#/WPF] Timeline 클래스 : DesiredFrameRateProperty 정적 속성을 사용해 애니메이션 프레임 레이트(Frame Reate) 설정하기 (0) | 2021.01.17 |
[C#/WPF] RegisterHotKey/UnregisterHotKey API 함수 : 전역 핫키 사용하기 (0) | 2021.01.09 |
[C#/WPF] FrameworkElement 클래스 : 이미지 저장하기 (0) | 2020.12.26 |
[C#/WPF] Canvas 클래스 : 다각형 도형 추가하기 (0) | 2020.12.26 |
[C#/WPF] Canvas 클래스 : 다각선 도형 추가하기 (0) | 2020.12.26 |
[C#/WPF] Canvas 클래스 : 호(Arc) 도형 추가하기 (0) | 2020.12.26 |
[C#/WPF] Canvas 클래스 : 선 도형 추가하기 (0) | 2020.12.26 |
댓글을 달아 주세요