데브피아 C#마을 조동현님께서 올리신 팁입니다.
개인 라이브러리에 추가해서 유용하게 잘 사용하고 있습니다.
아래 내용을 참고하면 아래와 같은 메세지 박스를 생성할 수 있습니다.
using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;
public class MessageBoxEx
{
delegate int HookProc(int code, IntPtr wParam, IntPtr lParam);
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr SetWindowsHookEx(int hook, HookProc callback, IntPtr hMod, uint dwThreadId);
[DllImport("user32.dll")]
static extern bool UnhookWindowsHookEx(IntPtr hhk);
[DllImport("user32.dll")]
static extern int CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);
[DllImport("user32.dll")]
static extern IntPtr GetDlgItem(IntPtr hDlg, DialogResult nIDDlgItem);
[DllImport("user32.dll")]
static extern bool SetDlgItemText(IntPtr hDlg, DialogResult nIDDlgItem, string lpString);
[DllImport("kernel32.dll")]
static extern uint GetCurrentThreadId();
static IntPtr g_hHook;
static string yes;
static string cancel;
static string no;
/// <summary>
/// 메시지 박스를 띠웁니다.
/// </summary>
/// <param name="text">텍스트 입니다.</param>
/// <param name="caption">캡션 입니다.</param>
/// <param name="yes">예 문자열 입니다.</param>
/// <param name="no">아니오 문자열 입니다.</param>
/// <param name="cancel">취소 문자열 입니다.</param>
/// <returns></returns>
public static DialogResult Show(string text, string caption, string yes, string no, string cancel)
{
MessageBoxEx.yes = yes;
MessageBoxEx.cancel = cancel;
MessageBoxEx.no = no;
g_hHook = SetWindowsHookEx(5, new HookProc(HookWndProc), IntPtr.Zero, GetCurrentThreadId());
return MessageBox.Show(text, caption, MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);
}
static int HookWndProc(int nCode, IntPtr wParam, IntPtr lParam)
{
IntPtr hChildWnd;
if (nCode == 5)
{
hChildWnd = wParam;
if (GetDlgItem(hChildWnd, DialogResult.Yes) != null)
SetDlgItemText(hChildWnd, DialogResult.Yes, MessageBoxEx.yes);
if (GetDlgItem(hChildWnd, DialogResult.No) != null)
SetDlgItemText(hChildWnd, DialogResult.No, MessageBoxEx.no);
if (GetDlgItem(hChildWnd, DialogResult.Cancel) != null)
SetDlgItemText(hChildWnd, DialogResult.Cancel, MessageBoxEx.cancel);
UnhookWindowsHookEx(g_hHook);
}
else
CallNextHookEx(g_hHook, nCode, wParam, lParam);
return 0;
}
}
엄청난 DllImport와 static이지요...
ex)
MessageBoxEx.Show("정지 하시겠습니까?", "정지", "야스", "노노", "취소닷!");
'Program > C#' 카테고리의 다른 글
C# 매니지드 코드를 이용해서 메모리 복사하기 (0) | 2010.03.19 |
---|---|
FTP 접속/다운로드/업로드/삭제/디렉토리 관 (0) | 2010.03.19 |
C# 웹페이지 로그인 및 자바스크립트 실행시키기 (0) | 2010.03.19 |
C# 포커스 빼앗지 않는 폼 구현하기 (0) | 2010.03.19 |
C#에서 Win32 API 사용하기 (0) | 2010.03.19 |