利用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

 

 

 

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

 

相关文章推荐

c#中(int)、int.Parse()、int.TryParse、Convert.ToInt32的区别

    以前经常为这几种数据类型转换方式而迷茫,这次为了彻底搞清它们之间的区别和优缺点,在网上查看了一些资料,并亲自验证了一下,在此写出来,一方面,为那些跟我有过相似经历的朋友们些许,另一方面,希望前...

int.TryParse 方法

int.TryParse 方法   程序开发中,免不了不同数据类型之间的转换。C#中针对转换有了一个TryParse的方法。 如果转换成功则返回true。否则返回false int.Try...

利用NativeWindow监视WndProc消息

http://blog.csdn.net/lovefootball/article/details/1784882 在写Windows应用程序的时候,经常会碰到需要修改例如MessageBox或者F...

消息处理函数LRESULT CALLBACK WndProc 和应用程序主函数int WINAPI WinMain

 Windows程序是事件驱动的,对于一个窗口,它的大部分例行维护是由系统维护的。每个窗口都有一个消息处理函数。在消息处理函数中,对传入的消息进行处理。系统内还有它自己的缺省消息处理函数。  ...

CLR FORM接收窗口消息并处理. SendMessage WndProc RegisterWindowMessage

问题的引入: 我希望在程序中有一个日志输出的窗口。最简单的就是在FORM上放一个LISTVIEW。然后程序各地调用日志输出的时候,在这个LISTVIEW中可以将日志写上去。 就像 LogFo...

delphi的消息处理机制TWinControl.WndProc

delphi在处理消息的时候是逐级调用的,最基础的算是 TWinControl.WndProc函数了,下面给出了这个函数的源代码。 procedure TWinControl.WndProc(var...

c#委托与事件、消息、WndProc用法(转)

c#委托与事件、消息、WndProc用法(转)   c#委托与事件 心得 c#用委托来实现事件通知机制。委托相当与c++函数指针。整个过程涉及一个呼叫者,一个被呼叫者,还有就是这个委托。 ...

消息处理函数LRESULT CALLBACK WndProc()、应用程序主函数int WINAPI WinMain ()

一、消息处理函数 LRESULT CALLBACK WndProc();//二、应用程序主函数int WINAPI WinMain ()Windows程序是事件驱动的,对于一个窗口,它的大部分例行维护...
  • ohmygol
  • ohmygol
  • 2011年01月13日 16:41
  • 6809

关于win32编程中消息循环和WndProc()窗口过程函

在win32程序的消息循环函数中   while (GetMessage (&msg, NULL, 0, 0))   {      TranslateMessage (&msg) ;     ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:利用NativeWindow监视WndProc消息
举报原因:
原因补充:

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