728x90
728x170
▶ 커스텀 메시지 박스 사용하기 예제
CustomMessageBox.Show("정지 하시겠습니까?", "정지", "예(Yes)", "아니오(No)", "취소(Cancel)");
728x90
▶ 커스텀 메시지 박스 사용하기
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
/// <summary>
/// 커스텀 메시지 박스
/// </summary>
public class CustomMessageBox
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Delegate
////////////////////////////////////////////////////////////////////////////////////////// Private
#region 후킹 델리게이트 - HookDelegate(hookCode, wordParameter, longParameter)
/// <summary>
/// 후킹 델리게이트
/// </summary>
/// <param name="hookCode">후킹 코드</param>
/// <param name="wordParameter">WORD 매개 변수</param>
/// <param name="longParameter">LONG 매개 변수</param>
/// <returns>처리 결과</returns>
private delegate int HookDelegate(int hookCode, IntPtr wordParameter, IntPtr longParameter);
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Import
////////////////////////////////////////////////////////////////////////////////////////// Static
//////////////////////////////////////////////////////////////////////////////// Private
#region 확장 윈도우 후킹 설정하기 - SetWindowsHookEx(hookCode, hookDelegate, moduleHandle, threadID);
/// <summary>
/// 확장 윈도우 후킹 설정하기
/// </summary>
/// <param name="hookCode">후킹 코드</param>
/// <param name="hookDelegate">후킹 델리게이트</param>
/// <param name="moduleHandle">모듈 핸들</param>
/// <param name="threadID">스레드 ID</param>
/// <returns>처리 결과</returns>
[DllImport("user32.dll", SetLastError = true)]
private static extern IntPtr SetWindowsHookEx(int hookCode, HookDelegate hookDelegate, IntPtr moduleHandle, uint threadID);
#endregion
#region 확장 윈도우 후킹 해제하기 - UnhookWindowsHookEx(hookHandle)
/// <summary>
/// 확장 윈도우 후킹 해제하기
/// </summary>
/// <param name="hookHandle">후킹 핸들</param>
/// <returns>처리 결과</returns>
[DllImport("user32.dll")]
private static extern bool UnhookWindowsHookEx(IntPtr hookHandle);
#endregion
#region 확장 다음 후킹 호출하기 - CallNextHookEx(hookHandle, hookCode, wordParameter, longParameter)
/// <summary>
/// 확장 다음 후킹 호출하기
/// </summary>
/// <param name="hookHandle">후킹 핸들</param>
/// <param name="hookCode">후킹 코드</param>
/// <param name="wordParameter">WORD 매개 변수</param>
/// <param name="longParameter">LONG 매개 변수</param>
/// <returns>처리 결과</returns>
[DllImport("user32.dll")]
private static extern int CallNextHookEx(IntPtr hookHandle, int hookCode, IntPtr wordParameter, IntPtr longParameter);
#endregion
#region 대화 상자 항목 구하기 - GetDlgItem(dialogHandle, dialogResult)
/// <summary>
/// 대화 상자 항목 구하기
/// </summary>
/// <param name="dialogHandle">대화 상자 핸들</param>
/// <param name="dialogResult">대화 상자 결과</param>
/// <returns>대화 상자 항목 핸들</returns>
[DllImport("user32.dll")]
private static extern IntPtr GetDlgItem(IntPtr dialogHandle, DialogResult dialogResult);
#endregion
#region 대화 상자 항목 텍스트 설정하기 - SetDlgItemText(dialogHandle, dialogResult, text)
/// <summary>
/// 대화 상자 항목 텍스트 설정하기
/// </summary>
/// <param name="dialogHandle">대화 상자 핸들</param>
/// <param name="dialogResult">대화 상자 결과</param>
/// <param name="text">텍스트</param>
/// <returns>처리 결과</returns>
[DllImport("user32.dll")]
private static extern bool SetDlgItemText(IntPtr dialogHandle, DialogResult dialogResult, string text);
#endregion
#region 현재 스레드 ID 구하기 - GetCurrentThreadId()
/// <summary>
/// 현재 스레드 ID 구하기
/// </summary>
/// <returns>현재 스레드 ID</returns>
[DllImport("kernel32.dll")]
private static extern uint GetCurrentThreadId();
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Field
////////////////////////////////////////////////////////////////////////////////////////// Static
//////////////////////////////////////////////////////////////////////////////// Private
#region Field
/// <summary>
/// 후킹 핸들
/// </summary>
private static IntPtr _hookHandle;
/// <summary>
/// 예 텍스트
/// </summary>
private static string _yesText;
/// <summary>
/// 아니오 텍스트
/// </summary>
private static string _noText;
/// <summary>
/// 취소 텍스트
/// </summary>
private static string _cancelText;
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Static
//////////////////////////////////////////////////////////////////////////////// Public
#region 보여주기 - Show(message, caption, yesText, noText, cancelText)
/// <summary>
/// 보여주기
/// </summary>
/// <param name="message">메시지</param>
/// <param name="caption">제목</param>
/// <param name="yesText">예 텍스트</param>
/// <param name="noText">아니오 텍스트</param>
/// <param name="cancelText">취소 텍스트</param>
/// <returns>다이얼로그 결과</returns>
public static DialogResult Show(string message, string caption, string yesText, string noText, string cancelText)
{
_yesText = yesText;
_noText = noText;
_cancelText = cancelText;
_hookHandle = SetWindowsHookEx(5, new HookDelegate(ProcessHook), IntPtr.Zero, GetCurrentThreadId());
return MessageBox.Show(message, caption, MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);
}
#endregion
//////////////////////////////////////////////////////////////////////////////// Private
#region 후킹 처리하기 - ProcessHook(hookCode, wordParameter, longParameter)
/// <summary>
/// 후킹 처리하기
/// </summary>
/// <param name="hookCode">후킹 코드</param>
/// <param name="wordParameter">WORD 매개 변수</param>
/// <param name="longParameter">LONG 매개 변수</param>
/// <returns>처리 결과</returns>
private static int ProcessHook(int hookCode, IntPtr wordParameter, IntPtr longParameter)
{
IntPtr childWindowHandle;
if(hookCode == 5)
{
childWindowHandle = wordParameter;
if(GetDlgItem(childWindowHandle, DialogResult.Yes) != null)
{
SetDlgItemText(childWindowHandle, DialogResult.Yes, _yesText);
}
if(GetDlgItem(childWindowHandle, DialogResult.No) != null)
{
SetDlgItemText(childWindowHandle, DialogResult.No, _noText);
}
if(GetDlgItem(childWindowHandle, DialogResult.Cancel) != null)
{
SetDlgItemText(childWindowHandle, DialogResult.Cancel, _cancelText);
}
UnhookWindowsHookEx(_hookHandle);
}
else
{
CallNextHookEx(_hookHandle, hookCode, wordParameter, longParameter);
}
return 0;
}
#endregion
}
728x90
그리드형(광고전용)
'C# > WinForm' 카테고리의 다른 글
[C#/WINFORM] 비트맵에서 커서 구하기 (0) | 2017.01.17 |
---|---|
[C#/WINFORM] WebBrowser 클래스 : DocumentCompleted 이벤트를 사용해 웹 문서 로드 완료시 처리하기 (0) | 2017.01.15 |
[C#/WINFORM] WebBrowser 클래스 : DocumentCompleted 이벤트를 사용해 웹 문서 로드 완료시 처리하기 (0) | 2017.01.15 |
[C#/WINFORM] 화면 보호기(Screen Saver) 만들기 (0) | 2017.01.15 |
[C#/WINFORM] AnimateWindow API 함수 : 윈도우 애니메이션 사용하기 (0) | 2017.01.15 |
[C#/WINFORM] Control 클래스 : MouseDown/MouseMove/MouseUp 이벤트를 사용해 도형 그리기 (0) | 2017.01.10 |
[C#/WINFORM] 알림 창 만들기 (0) | 2017.01.10 |
[C#/WINFORM] 폼 강제로 칠하기 (0) | 2016.12.14 |
[C#/WINFORM] 전체 화면 그래픽스 객체 구하기 (0) | 2016.12.14 |
[C#/WINFORM] Application 클래스 : StartupPath 정적 속성을 사용해 애플리케이션 실행 경로 구하기 (0) | 2016.12.11 |