本文共 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/