WPF 我佩服! 如何响应SendMessage?

MyjackL 2010-08-18 07:04:02
本来很简单的问题,WPF下搞得很复杂

WPF下的两个窗体WndTarget,WndSend,

WndSend 向WndTarget发送WM_MOUSEMOVE,WM_MOUSEDOWN,...消息,
WndTarget上写了PreviewMouseMove,MouseMove响应代码,发送以后就是不响应,

用SPY++看消息已经发送过去了,

...全文
867 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
636f6c696e 2011-03-28
  • 打赏
  • 举报
回复
重写消息处理函数就可以了
weizhenya 2011-03-28
  • 打赏
  • 举报
回复
不用sendMessage,而是用owner属性
在WndTarget中定义一个中间方法(如:Newmethod)
在WndSend中的响应事件中调用即可
调用方法如下:
((WndTarget)this.owner).Newmethod(....)

在Newmethod中添加要相应的处理


补充:必须把WndTarget的窗体设为WndSend窗体的owner

weizhenya 2011-03-28
  • 打赏
  • 举报
回复
不用sendMessage,而是用owner属性
在WndTarget中定义一个中间方法(如:Newmethod)
在WndSend中的响应事件中调用即可
调用方法如下:
((WndTarget)this.owner).Newmethod(....)

在Newmethod中添加要相应的处理
pavee 2010-08-19
  • 打赏
  • 举报
回复
建议使用MEF和MVVM Light.
MyjackL 2010-08-19
  • 打赏
  • 举报
回复
补充一下,两个窗体都要响应,不能简单的穿透,所以要把消息分发一下

还有是基于消息响应 还是基于消息路由的,这个不是问题,

Windows 将消息传递到窗口,WPF的程序内部好像做了过滤,
外部程序发来的消息,窗口没激活就不响应
鼠标直接移上去相当于Windows 发来的消息,没激活也可以响应

(大家可以做一个MouseMove)做个测试

MyjackL 2010-08-19
  • 打赏
  • 举报
回复
这个也考虑过

截获消息后,有什么办法手动触发所有PreviewMouseMove 事件,用GetinvocationList吗?

谁能列出一下代码
jeven_xiao 2010-08-19
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 jackson35296 的回复:]
WPF不是基于消息响应的,WPF用的路由事件,如果想响应消息参考以下代码

C# code

private const int WM_MOUSEMOVE = 0x200;
IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
if (msg == WM_M……
[/Quote]可以参考至少我也认为是这样
porschev 2010-08-19
  • 打赏
  • 举报
回复
没有用过。。
jackson35296 2010-08-19
  • 打赏
  • 举报
回复
WPF不是基于消息响应的,WPF用的路由事件,如果想响应消息参考以下代码

private const int WM_MOUSEMOVE = 0x200;
IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
if (msg == WM_MOUSEMOVE)
{
//在这里添加鼠标移动的响应

handled = true;
}
return (new IntPtr(0));
}

//窗口Loaded事件响应
private void Window_Loaded(object sender, RoutedEventArgs e)
{
IntPtr hwnd = new WindowInteropHelper(this).Handle;
HwndSource hs = HwndSource.FromHwnd(hwnd);
hs.AddHook(new HwndSourceHook(WndProc));
}

heguo 2010-08-19
  • 打赏
  • 举报
回复
wpf除了Window和WinformHost还保有handle外,
其它所有控件都是重新构建,与win32控件大不同,没有handle
你考虑用下WinformHost控件.
MyjackL 2010-08-19
  • 打赏
  • 举报
回复
我要实现的就是窗口的穿透,现在加一句代码Mouse.Capture(),就可以了,不过,副窗口就不能响应了。
还试了SetWindowLong(handle, GWL_EXSTYLE, (int)GetWindowLong(this.Handle, GWL_EXSTYLE) | WS_DISABLED);这个好像没用

另外,还想到的办法是做一个全局钩子,触发鼠标事件.

目前只能这样了
threenewbee 2010-08-18
  • 打赏
  • 举报
回复
本身WPF的目的就是为了构建UI抽象层,实现跨平台性。

请问,Linux/X Server上有WM_MOUSEMOVE么?

WPF大大简化了编程模型,使得程序员不用考虑本地API的差异化。LZ既然选择WPF而不是WinForms,应该了解WPF的设计目标、适用特性,而不要去干给汽车卸下发动机,装上牲口栓,用马来拉的事情。
曲滨_銘龘鶽 2010-08-18
  • 打赏
  • 举报
回复
据说 WPF 采用了,DirectX 的技术,是不是键盘,鼠标输入这里也是那?

如果是这样的话,wm_* 估计就不灵了

我只是猜想,还没这么玩过呵呵

110,499

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧