关闭

利用NativeWindow监视WndProc消息

标签: stringcommanduserobjectnullicons
5902人阅读 评论(5) 收藏 举报
分类:

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

 

 

 

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

 

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:47180次
    • 积分:651
    • 等级:
    • 排名:千里之外
    • 原创:15篇
    • 转载:0篇
    • 译文:0篇
    • 评论:33条
    最新评论