MessageBoxEx.cs
上传用户:lqb116
上传日期:2014-04-04
资源大小:2712k
文件大小:6k
源码类别:

P2P编程

开发平台:

C#

  1. using System;
  2. using System.Text;
  3. using System.Runtime.InteropServices;
  4. using System.Security.Permissions;
  5. [assembly: SecurityPermission(SecurityAction.RequestMinimum, UnmanagedCode = true)]
  6. namespace System.Windows.Forms
  7. {
  8. public class MessageBoxEx
  9. {
  10. public static DialogResult Show(string text, uint uTimeout)
  11. {
  12. Setup("", uTimeout);
  13. return MessageBox.Show(text);
  14. }
  15. public static DialogResult Show(string text, string caption, uint uTimeout)
  16. {
  17. Setup(caption, uTimeout);
  18. return MessageBox.Show(text, caption);
  19. }
  20. public static DialogResult Show(string text, string caption, MessageBoxButtons buttons, uint uTimeout)
  21. {
  22. Setup(caption, uTimeout);
  23. return MessageBox.Show(text, caption, buttons);
  24. }
  25. public static DialogResult Show(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, uint uTimeout)
  26. {
  27. Setup(caption, uTimeout);
  28. return MessageBox.Show(text, caption, buttons, icon);
  29. }
  30. public static DialogResult Show(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defButton, uint uTimeout)
  31. {
  32. Setup(caption, uTimeout);
  33. return MessageBox.Show(text, caption, buttons, icon, defButton);
  34. }
  35. public static DialogResult Show(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defButton, MessageBoxOptions options, uint uTimeout)
  36. {
  37. Setup(caption, uTimeout);
  38. return MessageBox.Show(text, caption, buttons, icon, defButton, options);
  39. }
  40. public static DialogResult Show(IWin32Window owner, string text, uint uTimeout)
  41. {
  42. Setup("", uTimeout);
  43. return MessageBox.Show(owner, text);
  44. }
  45. public static DialogResult Show(IWin32Window owner, string text, string caption, uint uTimeout)
  46. {
  47. Setup(caption, uTimeout);
  48. return MessageBox.Show(owner, text, caption);
  49. }
  50. public static DialogResult Show(IWin32Window owner, string text, string caption, MessageBoxButtons buttons, uint uTimeout)
  51. {
  52. Setup(caption, uTimeout);
  53. return MessageBox.Show(owner, text, caption, buttons);
  54. }
  55. public static DialogResult Show(IWin32Window owner, string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, uint uTimeout)
  56. {
  57. Setup(caption, uTimeout);
  58. return MessageBox.Show(owner, text, caption, buttons, icon);
  59. }
  60. public static DialogResult Show(IWin32Window owner, string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defButton, uint uTimeout)
  61. {
  62. Setup(caption, uTimeout);
  63. return MessageBox.Show(owner, text, caption, buttons, icon, defButton);
  64. }
  65. public static DialogResult Show(IWin32Window owner, string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defButton, MessageBoxOptions options, uint uTimeout)
  66. {
  67. Setup(caption, uTimeout);
  68. return MessageBox.Show(owner, text, caption, buttons, icon, defButton, options);
  69. }
  70. public delegate IntPtr HookProc(int nCode, IntPtr wParam, IntPtr lParam);
  71. public delegate void TimerProc(IntPtr hWnd, uint uMsg, UIntPtr nIDEvent, uint dwTime);
  72. public const int WH_CALLWNDPROCRET = 12;
  73. public const int WM_DESTROY = 0x0002;
  74. public const int WM_INITDIALOG = 0x0110;
  75. public const int WM_TIMER = 0x0113;
  76. public const int WM_USER = 0x400;
  77. public const int DM_GETDEFID = WM_USER + 0;
  78. [DllImport("User32.dll")]
  79. public static extern UIntPtr SetTimer(IntPtr hWnd, UIntPtr nIDEvent, uint uElapse, TimerProc lpTimerFunc);
  80. [DllImport("User32.dll")]
  81. public static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);
  82. [DllImport("user32.dll")]
  83. public static extern IntPtr SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);
  84. [DllImport("user32.dll")]
  85. public static extern int UnhookWindowsHookEx(IntPtr idHook);
  86. [DllImport("user32.dll")]
  87. public static extern IntPtr CallNextHookEx(IntPtr idHook, int nCode, IntPtr wParam, IntPtr lParam);
  88. [DllImport("user32.dll")]
  89. public static extern int GetWindowTextLength(IntPtr hWnd);
  90. [DllImport("user32.dll")]
  91. public static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int maxLength);
  92. [DllImport("user32.dll")]
  93. public static extern int EndDialog(IntPtr hDlg, IntPtr nResult);
  94. [StructLayout(LayoutKind.Sequential)]
  95. public struct CWPRETSTRUCT
  96. {
  97. public IntPtr lResult;
  98. public IntPtr lParam;
  99. public IntPtr wParam;
  100. public uint   message;
  101. public IntPtr hwnd;
  102. };
  103. private const int TimerID = 42;
  104. private static HookProc hookProc;
  105. private static TimerProc hookTimer;
  106. private static uint hookTimeout;
  107. private static string hookCaption;
  108. private static IntPtr hHook;
  109. static MessageBoxEx()
  110. {
  111. hookProc = new HookProc(MessageBoxHookProc);
  112. hookTimer = new TimerProc(MessageBoxTimerProc);
  113. hookTimeout = 0;
  114. hookCaption = null;
  115. hHook = IntPtr.Zero;
  116. }
  117. private static void Setup(string caption, uint uTimeout)
  118. {
  119. if (hHook != IntPtr.Zero)
  120. throw new NotSupportedException("multiple calls are not supported");
  121. hookTimeout = uTimeout;
  122. hookCaption = caption != null ? caption : "";
  123. hHook = SetWindowsHookEx(WH_CALLWNDPROCRET, hookProc, IntPtr.Zero, AppDomain.GetCurrentThreadId());
  124. }
  125. private static IntPtr MessageBoxHookProc(int nCode, IntPtr wParam, IntPtr lParam)
  126. {
  127. if (nCode < 0)
  128. return CallNextHookEx(hHook, nCode, wParam, lParam);
  129. CWPRETSTRUCT msg = (CWPRETSTRUCT)Marshal.PtrToStructure(lParam, typeof(CWPRETSTRUCT));
  130. IntPtr hook = hHook;
  131. if (hookCaption != null && msg.message == WM_INITDIALOG)
  132. {
  133. int nLength = GetWindowTextLength(msg.hwnd);
  134. StringBuilder text = new StringBuilder(nLength + 1);
  135. GetWindowText(msg.hwnd, text, text.Capacity);
  136. if (hookCaption == text.ToString())
  137. {
  138. hookCaption = null;
  139. SetTimer(msg.hwnd, (UIntPtr)TimerID, hookTimeout, hookTimer);
  140. UnhookWindowsHookEx(hHook);
  141. hHook = IntPtr.Zero;
  142. }
  143. }
  144. return CallNextHookEx(hook, nCode, wParam, lParam);
  145. }
  146. private static void MessageBoxTimerProc(IntPtr hWnd, uint uMsg, UIntPtr nIDEvent, uint dwTime)
  147. {
  148. if (nIDEvent == (UIntPtr)TimerID)
  149. {
  150. short dw = (short)SendMessage(hWnd, DM_GETDEFID, IntPtr.Zero, IntPtr.Zero);
  151. EndDialog(hWnd, (IntPtr)dw);
  152. }
  153. }
  154. }
  155. }