利用NativeWindow监视WndProc消息
来源:互联网 发布:office 2013 优化版 编辑:程序博客网 时间:2024/06/08 10:39
http://blog.csdn.net/lovefootball/article/details/1784882
在写Windows应用程序的时候,经常会碰到需要修改例如MessageBox或者FileDialog的外观
此时我们需要监视 WndProc的消息
当然也可以直接调用API实现,具体方法请参考
http://www.codeproject.com/csharp/GetSaveFileName.asp?df=100&forumid=96342&exp=0&select=1950454
主要代码如下
- using System;
- using System.Runtime.InteropServices;
- using System.Windows.Forms;
- using System.Collections.Generic;
- namespace testApplication1
- {
- public delegatevoid HookWndProcHandler(ref Message m);
- public class HookWndProc
- {
- private Dictionary<Control, NativeWindow> nativeWindows =new Dictionary<Control, NativeWindow>();
- public event HookWndProcHandler WndProcEvent;
- public void BeginHookProc(Control control)
- {
- if(nativeWindows.ContainsKey(control))
- {
- return;
- }
- nativeWindows.Add(control, new HookNativeWindow(this, control));
- }
- public void EndHookProc(Control control)
- {
- if(!nativeWindows.ContainsKey(control))
- {
- return;
- }
- NativeWindow window = nativeWindows[control];
- nativeWindows.Remove(control);
- window.ReleaseHandle();
- window = null;
- }
- protected virtual void WndProc(ref Message m)
- {
- FireWndProcEvent(ref m);
- }
- protected void FireWndProcEvent(ref Message m)
- {
- if (WndProcEvent != null)
- {
- WndProcEvent(ref m);
- }
- }
- #region NativeWindow
- protected class HookNativeWindow : NativeWindow
- {
- private HookWndProc hookWndProc;
- public HookNativeWindow(HookWndProc hookWndProc, Control control)
- {
- this.hookWndProc = hookWndProc;
- if (control.IsHandleCreated)
- {
- AssignHandle(control.Handle);
- }
- else
- {
- control.HandleCreated += new EventHandler(OnControlHandleCreated);
- }
- control.HandleDestroyed += new EventHandler(OnControlHandleDestroyed);
- }
- private void OnControlHandleCreated(object sender, EventArgs e)
- {
- AssignHandle(((Control)sender).Handle);
- }
- private void OnControlHandleDestroyed(object sender, EventArgs e)
- {
- ReleaseHandle();
- }
- [System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name ="FullTrust")]
- protected override void WndProc(ref Message m)
- {
- hookWndProc.WndProc(ref m);
- base.WndProc(ref m);
- }
- }
- #endregion
- }
- }
调用方法,以更改MessageBox的OK按钮文本为例
HookWndProc hookWndProc= new HookWndProc();
hookWndProc.WndProcEvent+= new HookWndProcHandler(hookWndProc_WndProcEvent);
hookWndProc.BeginHookProc(this);
MessageBox.Show("MSG APP","MessageBoxCaption", MessageBoxButtons.OKCancel);
hookWndProc.EndHookProc(this);
privatevoid hookWndProc_WndProcEvent(ref Message m)
...{
IntPtr wnd= FindWindow(null,"MessageBoxCaption");
if (wnd != IntPtr.Zero)
...{
SetDlgItemText(wnd,1, "需要修改的文本");
}
}
[DllImport("user32.dll", EntryPoint ="FindWindow", CharSet= CharSet.Auto)]
private extern static IntPtr FindWindow(string lpClassName,string lpWindowName);
[DllImport("user32.dll")]
public static extern IntPtr SetDlgItemText(IntPtr hwnd,int id, string caption);
也就是说在WndProcEvent事件里面你可以写上你所需要做的事情
如果需要修改FileDialog的外观
则需要在WndProcEvent事件里面写上如下代码
if (m.Msg== WM_ENTERIDLE)
...{
uint dialogHandle= (uint)m.LParam;
uint listviewHandle= FindWindowEx(dialogHandle,0, "SHELLDLL_DefView","");
if (listviewHandle!= 0&& listviewHandle!= lastListViewHandle)
...{
SendMessage(listviewHandle, WM_COMMAND, (uint)View,0);
}
lastListViewHandle= listviewHandle;
/**////<summary>
/// FileListViewType
/// </summary>
public enum FileListView
...{
Icons= 0x7029,
SmallIcons= 0x702a,
List= 0x702b,
Details= 0x702c,
Thumbnails= 0x7031,
XpThumbnails= 0x702d
}
/**////<summary>
/// win message : command
/// </summary>
private const uint WM_COMMAND= 0x0111;
/**////<summary>
/// win message : enter idle
/// </summary>
private const uint WM_ENTERIDLE= 0x0121;
/**////<summary>
/// listview type
/// </summary>
private FileListView view= FileListView.Thumbnails;
/**////<summary>
/// dialog handle
/// </summary>
private uint lastListViewHandle= 0;
DllImports
#region DllImports
[DllImport("user32.dll", EntryPoint="SendMessageA", CallingConvention=CallingConvention.StdCall,CharSet=CharSet.Ansi)]
private static externuint SendMessage(uint Hdc,uint Msg_Const,uint wParam, uint lParam);
[DllImport("user32.dll", EntryPoint="FindWindowExA", CallingConvention=CallingConvention.StdCall,CharSet=CharSet.Ansi)]
private static externuint FindWindowEx(uint hwndParent,uint hwndChildAfter,string lpszClass,string lpszWindow);
#endregion
...{
uint dialogHandle= (uint)m.LParam;
uint listviewHandle= FindWindowEx(dialogHandle,0, "SHELLDLL_DefView","");
if (listviewHandle!= 0&& listviewHandle!= lastListViewHandle)
...{
SendMessage(listviewHandle, WM_COMMAND, (uint)View,0);
}
lastListViewHandle= listviewHandle;
/**////<summary>
/// FileListViewType
/// </summary>
public enum FileListView
...{
Icons= 0x7029,
SmallIcons= 0x702a,
List= 0x702b,
Details= 0x702c,
Thumbnails= 0x7031,
XpThumbnails= 0x702d
}
/**////<summary>
/// win message : command
/// </summary>
private const uint WM_COMMAND= 0x0111;
/**////<summary>
/// win message : enter idle
/// </summary>
private const uint WM_ENTERIDLE= 0x0121;
/**////<summary>
/// listview type
/// </summary>
private FileListView view= FileListView.Thumbnails;
/**////<summary>
/// dialog handle
/// </summary>
private uint lastListViewHandle= 0;
DllImports
#region DllImports
[DllImport("user32.dll", EntryPoint="SendMessageA", CallingConvention=CallingConvention.StdCall,CharSet=CharSet.Ansi)]
private static externuint SendMessage(uint Hdc,uint Msg_Const,uint wParam, uint lParam);
[DllImport("user32.dll", EntryPoint="FindWindowExA", CallingConvention=CallingConvention.StdCall,CharSet=CharSet.Ansi)]
private static externuint FindWindowEx(uint hwndParent,uint hwndChildAfter,string lpszClass,string lpszWindow);
#endregion
SetDlgItemText(wnd, 1, "需要修改的文本");
private const int IDOK = 1;
private const int IDCANCEL = 2;
private const int IDABORT = 3;
private const int IDRETRY = 4;
private const int IDIGNORE = 5;
private const int IDYES = 6;
private const int IDNO = 7;
欢迎转载,请注明出处~~
- 利用NativeWindow监视WndProc消息
- 利用NativeWindow监视WndProc消息
- Wpf WndProc 消息处理
- 拦截窗体消息—使用NativeWindow
- delphi的消息处理机制TWinControl.WndProc
- WndProc 与win32程序消息循环
- C#委托与事件、消息、WndProc用法
- 重写WndProc方法来处理 Windows 消息
- C# 重写WndProc 拦截 发送 系统消息
- 利用反汇编对WNDPROC进行追踪
- 利用gdb监视内存
- 利用勾子监视系统或进程中的各种事件消息,截获发往目标窗口的消息并进行处理
- VB.NET WndProc、C# WndProc 与系统消息的链接地址
- CLR FORM接收窗口消息并处理. SendMessage WndProc RegisterWindowMessage
- c#委托与事件、消息、WndProc用法(转)
- 利用友元处理自定义窗口类的WndProc
- 利用信号监视进程存在
- 利用RegisterDeviceNotification监视usb设备
- Google Analytics跨域跟踪的实现方法
- EditText设置/隐藏光标位置、选中文本和获取/清除焦点
- 勾股定理证明
- php是什么?
- MFC操作——设置静态文本 大小 字体格式 颜色
- 利用NativeWindow监视WndProc消息
- 那些年,我们一起学过的R语言
- log4 net
- Shell 学习(一、编写shell脚本和执行)
- 3-5年的漫长寒冬 小微企业如何过?
- Asp.Net中不修改IIS实现URL重写,支持任意扩展名及无扩展名(伪静态)
- TCP/IP 学习笔记
- svn在linux下的使用
- android 消息提醒(Toast,Notification)