博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WPF 利用HwndSource拦截Windows消息
阅读量:4092 次
发布时间:2019-05-25

本文共 1674 字,大约阅读时间需要 5 分钟。

WPF下取得控件或窗体的句柄

窗体:

IntPtr hwnd = new WindowInteropHelper(this).Handle;
控件:
IntPtr hwnd = ((HwndSource)PresentationSource.FromVisual(uielement)).Handle;

消息:

WPF提供了一个HwndSource可以使你更快的实现处理Windows消息。

通过HwndSource.FromHwnd得到的HwndSource可以添加(AddHook)移除(Remove)Hook

 

public partial class MainWindow : Window    {        public MainWindow()        {            InitializeComponent();            Loaded+= HandleInitialized;        }         public void HandleInitialized(object o,EventArgs e)        {            IntPtr wptr = new WindowInteropHelper(this).Handle;            HwndSource hs = HwndSource.FromHwnd(wptr);            hs.AddHook(new HwndSourceHook(WpfHandleWinowMsg));        }         public IntPtr WpfHandleWinowMsg(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)        {               //这个函数可以做很多事情,只要是windows消息都会经过,例如注册全局快捷键,修改窗体大小边框,等等            //也可以调API做对应的事情            int WM_SHOW_STOPBUTTON = 0x0400 + 100; //显示停止按钮            int WM_SHOW_STARTBUTTON = 0x0400 + 101; //显示开始按钮            switch (msg)            {                case 1:                    break;                case 2:                    break;                default:                     break;            }            return IntPtr.Zero;        }    }

可以在MFC中,编写自定义消息函数,注意,这里的窗体名称是指wpf窗体的Title属性,我这里的Title="MainWindow"

void MyTest::SendMessageToMainWindow(int nMsg)	{		HWND  mMainWindowHandle;		mMainWindowHandle = ::FindWindow(NULL, _T("MainWindow"));		SendMessage(mMainWindowHandle, nMsg, NULL, NULL);	}
#define WM_SHOW_STOPBUTTON (WM_USER+100) //显示停止按钮#define WM_SHOW_STARTBUTTON (WM_USER+101) //显示开始按钮void My::Clear(){	SendMessageToMainWindow(WM_SHOW_STOPBUTTON);}

 

 

 

参考

转载地址:http://ptiii.baihongyu.com/

你可能感兴趣的文章
JavaScript实现页面无刷新让时间走动
查看>>
CSS实例:Tab选项卡效果
查看>>
前端设计之特效表单
查看>>
前端设计之CSS布局:上中下三栏自适应高度CSS布局
查看>>
Java的时间操作玩法实例若干
查看>>
JavaScript:时间日期格式验证大全
查看>>
pinyin4j:拼音与汉字的转换实例
查看>>
XML工具代码:SAX从String字符串XML内获取指定节点或属性的值
查看>>
时间日期:获取两个日期相差几天
查看>>
责任链模式 Chain of Responsibility
查看>>
高并发与大数据解决方案概述
查看>>
解决SimpleDateFormat线程安全问题NumberFormatException: multiple points
查看>>
MySQL数据库存储引擎简介
查看>>
处理Maven本地仓库.lastUpdated文件
查看>>
Kafka | 请求是怎么被处理的?
查看>>
Java并发编程1-线程池
查看>>
CentOS7,玩转samba服务,基于身份验证的共享
查看>>
计算机网络-网络协议模型
查看>>
计算机网络-OSI各层概述
查看>>
Java--String/StringBuffer/StringBuilder区别
查看>>