利用NativeWindow监视WndProc消息

原创 2007年09月14日 11:27:00

在写Windows应用程序的时候,经常会碰到需要修改例如MessageBox或者FileDialog的外观
此时我们需要监视 WndProc的消息
当然也可以直接调用API实现,具体方法请参考
http://www.codeproject.com/csharp/GetSaveFileName.asp?df=100&forumid=96342&exp=0&select=1950454
主要代码如下

 

调用方法,以更改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);

private void 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 extern uint SendMessage(uint Hdc, uint Msg_Const, uint wParam, uint lParam);

        [DllImport(
"user32.dll", EntryPoint="FindWindowExA", CallingConvention=CallingConvention.StdCall,CharSet=CharSet.Ansi)] 
        
private static extern uint FindWindowEx(uint hwndParent, uint hwndChildAfter, string lpszClass, string lpszWindow);

        
#endregion

 

 

 

欢迎转载,请注明出处~~

 

WPF Window 中实现WndProc

using System; using System.Windows; using System.Windows.Interop; namespace WpfApplication1 { p...
  • DoitPlayer
  • DoitPlayer
  • 2017年06月01日 16:58
  • 538

拦截窗体消息—使用NativeWindow

NativeWindow提供窗口句柄和窗口过程的低级封装。下面是拦截ContextMenu的显示和消失的例子    public class NativeContextMenu : NativeWin...
  • aptentity
  • aptentity
  • 2010年06月01日 09:52
  • 3572

利用NativeWindow监视WndProc消息

http://blog.csdn.net/lovefootball/article/details/1784882 在写Windows应用程序的时候,经常会碰到需要修改例如MessageBox或者F...
  • jiangxinyu
  • jiangxinyu
  • 2012年10月17日 11:08
  • 1840

《Windows核心编程》の窗口过程的使用

1)设计一个窗口过程:下面的实例代码展现了经典的窗口过程的结构。窗口过程使用switch语句处理传入的消息参数uMsg,LRESULT CALLBACK MainWndProc(    HWND hw...
  • ACE1985
  • ACE1985
  • 2010年08月28日 19:43
  • 1950

C#可以直接调用的Win32API

http://www.cnblogs.com/jxsoft/archive/2012/06/29/2569876.html   整理的Win32 API,可以直接在C#中直接调用,在做WinFor...
  • jiangxinyu
  • jiangxinyu
  • 2012年10月22日 15:36
  • 7430

C# 重写WndProc 拦截 发送 系统消息

C# 重写WndProc 拦截 发送 系统消息 + windows消息常量值(1)           #region 截获消息         /// 截获消息  处理XP不能关机问题...
  • shmily0923
  • shmily0923
  • 2015年08月05日 09:34
  • 2041

重写WndProc函数

 WndProc函数作用:主要用在拦截并处理系统消息和自定义消息 比如:windows程序会产生很多消息,比如你单击鼠标,移动窗口都会产生消息。这个函数就是默认的消息处理函数。你可以重载这个函数来制定...
  • xochenlin
  • xochenlin
  • 2009年07月07日 17:56
  • 6180

《Windows核心编程》の窗口过程的使用

1)设计一个窗口过程:下面的实例代码展现了经典的窗口过程的结构。窗口过程使用switch语句处理传入的消息参数uMsg,LRESULT CALLBACK MainWndProc(    HWND hw...
  • ACE1985
  • ACE1985
  • 2010年08月28日 19:43
  • 1950

C# 调用window api大全

Win32API.cs 源码下载 http://files.cnblogs.com/lordeo/win32api.rar using System; using System.Dra...
  • zh_geo
  • zh_geo
  • 2015年08月19日 11:49
  • 2098

将WndProc 消息传给 panel控件,获取消息内容,触发某些事件

var  FOldProc : TWndMethod;  先保存panel原来的消息 FOldProc := GroupBox3.WindowProc;  GroupBox3.Wind...
  • y281252548
  • y281252548
  • 2017年02月14日 16:11
  • 283
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:利用NativeWindow监视WndProc消息
举报原因:
原因补充:

(最多只允许输入30个字)