C#中代码触发事件,wpf中PerformClick
来源:互联网 发布:苏醒rap水平知乎 编辑:程序博客网 时间:2024/06/04 07:07
WPF没有提供这个方法,还真是让人觉得有些讨厌啊。而关于这个嘛,Google中搜一下,一大堆,但一般是利用XXXAutomationPeer。
ButtonAutomationPeer
命名空间: System.Windows.Automation.Peers
程序集: PresentationFramework(在 PresentationFramework.dll 中)
这个原本用于支持自动化测试的,被拿来干了这事,代码如下:
{
var peer =new ButtonAutomationPeer(button);
var invokeProv = peer.GetPattern(PatternInterface.Invoke) as IInvokeProvider;
if (invokeProv != null)
{
invokeProv.Invoke();
}
}
但很快地,你会发现去其依赖于具体的类:ButtonAutomationPeer, 所以WPF实现了一堆XXXAutomationPeer, 这多少让人觉得有些.... 比如“我想在任意UI元素上模拟下鼠标点击”,这种方法便不可行了,虽然有一堆Peer,再多也不是“任意”,那么用SendMessage吧,这才是王道,代码如下:
{
var window = Window.GetWindow(element);
if (window != null)
{
var windowHwnd = GetHwnd(window);
var locOfElement = element.TranslatePoint(new Point(0, 0), window);
var pointToWindow = new Point(point.X + locOfElement.X, point.Y + locOfElement.Y);
Int32 lparam = MakeLong((int)pointToWindow.X, (int)pointToWindow.Y);
// WM_LBUTTONDOWN = 0x0201
SendMessage(windowHwnd, WM_LBUTTONDOWN, 0, lparam);
// WM_LBUTTONUP = 0x0202;
SendMessage(windowHwnd, WM_LBUTTONUP, 0, lparam);
}
}
internal static int MakeLong(int lowWord, int highWord)
{
return (highWord << 16) | (lowWord & 0xffff);
}
internal static IntPtr GetHwnd(this Window window)
{
var winHelper = new WindowInteropHelper(window);
return winHelper.Handle;
}
这个方法可以拓展到任意UI元素上,但很奇怪的是:居然不会引发Button的Click事件!从效果上看,的确点击了,因为焦点都转移上去了。那好吧,再用用下面的方法吧:反射,我比较喜欢这个方式:
{
var method = button.GetType().GetMethod("OnClick",
BindingFlags.NonPublic | BindingFlags.Instance);
if (method != null)
{
method.Invoke(button, null);
}
//button.Focus();
}
OK,总结一下:
第一种方法,依赖于具体的XXXPeer, 能力有限,不够灵活
第二种方法,较灵活,但由于SendMessage第一个参数要求传入hwnd,而WPF普通控件没有句柄,所以其依赖于窗口句柄,也就是该方法依赖窗口
第三种方法,我喜欢。有什么缺点吗?如果没有,为啥Google上的朋友们都用第一种方法?如果有,是啥?
-----------------------
[update]
最近看到一个开源项目, 专门模拟键盘和鼠标,非常棒: http://inputsimulator.codeplex.com/
源代码打包下载 : http://files.cnblogs.com/zhouyinhui/WindowsInput.zip
使用方法嘛,比如:
sim.Mouse.LeftButtonDown();
- C#中代码触发事件,wpf中PerformClick
- WPF中,回车触发按钮点击事件
- view.performClick()触发点击事件
- view.performClick()触发点击事件
- Android中performClick方法---代码调用点击事件(模拟去触摸控件)
- 在android中用代码触发一个按钮的点击事件的代码是: buttonName.performClick();
- C#中自定义事件的触发
- C# 中panel的mousewheel事件触发
- C# 中 TabPage 控件 点击触发事件
- C#中串口接收数据触发事件
- WinForm中,Button按钮有PerformClick()方法,可以模拟用户单击鼠标. 即button.PerformClick()生成按钮的事件。
- 在C#中使用代理的方式触发事件
- 在C#中使用代理的方式触发事件
- 在C#中使用代理的方式触发事件
- 在C#中使用代理的方式触发事件
- 在C#中使用代理的方式触发事件
- 在C#中使用代理的方式触发事件
- 在C#中使用代理的方式触发事件
- 第九周自动班要完成任务
- 重要的网站:计算机视觉类
- 多线程锁:互斥内核对象(进程锁)
- C#调用WebService实例和开发
- 使用Eclipse自带的Axis1插件生成WSDL文件
- C#中代码触发事件,wpf中PerformClick
- GoldenGate学习之旅-5(ogg12C的安装)
- JSP -- EL表达式
- Android中解析xml文件的方法
- Centos配置静态IP
- Hadoop配置 - net.core.somaxconn
- Android系统启动流程 -- linux kernel
- 车厢重组--冒泡排序
- 求割边最小的最小割