在c#中使用win32 API操作简单的windows计算器
本文关键字:操作简单 windows 计算器 API win32 | 更新日期: 2023-09-27 17:50:08
嗯,我已经尽了最大的努力去看代码示例,并在网上发布了关于如何做到这一点的帖子,但是几个月来我一直没有能够使用windows API与另一个已经运行的程序进行交互。我不是最优秀的程序员,有些东西超出了我的能力范围。
我能做的最多的是找到计算器进程和它的句柄,并使用SetWindowText来改变标题。我真正想学习的是如何让我的程序使用windows user32(我认为这一定是正确的库)通过实际按下软件计算器上的数字键按钮来输入一些数字,以进行简单的计算。
我并没有真正使用这个程序,它只是我试图达到的一个目标,学习如何使用windows API超过我的初级水平,特别是在c#中。如果没有人有这样的代码,或者即使你有,我也非常感谢一些关于我应该阅读的书籍或资源的建议,以学习如何做到这一点。
既然你说你在使用c#,你应该使用System.Windows.Automation
命名空间,它的全部目的是允许你通过自动化控制其他程序。
你没有详细说明你想要什么,但这里有一个程序可以在计算器中输入"7"。
using System.Windows.Automation;
class Program
{
public static void Main()
{
var calcWindow = AutomationElement.RootElement.FindFirst(
TreeScope.Children,
new PropertyCondition(AutomationElement.NameProperty, "Calculator"));
if (calcWindow == null) return;
var sevenButton = calcWindow.FindFirst(TreeScope.Descendants,
new PropertyCondition(AutomationElement.NameProperty, "7"));
var invokePattern = sevenButton.GetCurrentPattern(InvokePattern.Pattern)
as InvokePattern;
invokePattern.Invoke();
}
}
您正在进入平台调用(p/Invoke)的有趣世界。你在这个世界上最好的朋友是www.pinvoke.net,它包含c# (和vb.net)签名,用于大量的winapi函数。
例如,SendMessage
:
[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);
和这个消息代码列表
您会注意到所有的p/invoke方法都使用DllImport
属性,在System.Runtime.InteropServices
命名空间中找到。
在方法签名中也有一个extern
修饰符。这意味着该代码是在当前程序集之外找到的。
你可以使用SendMessage
向计算器的句柄发送消息。
正如Jonathan在他的评论中提到的,您应该使用 spy++ 来检测正在发送的哪些消息会导致您想要复制的操作。
作为更好的措施,这里有一篇关于p/Invoke的更多介绍性信息的文章。