利用NativeWindow监视WndProc消息

在写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

 

 

 

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

 

阅读更多
个人分类: Winform应用
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭