操作简单的Windows计算器使用C#中的win32 API?

那么,我已经尽我所能去查看代码示例,并在网上发布如何做到这一点,但是我几个月来还没有能够使用Windows API与其他程序进行交互运行。 我不是最伟大的程序员,有些东西超出了我的想象。

我已经能够做的最多的是find计算器进程和它的句柄,并用SetWindowText来改变标题。 我真的很想学习如何做的是让我的程序使用windows user32(我认为这必须是正确的库),通过实际按下软件计算器上的数字键button来input一些数字,以进行简单的计算。

我真的没有这个程序的用途,这只是一个目标,我试图达到学习如何使用Windows API特别是在C#中的初学者水平。 如果没有人有这样的代码,或者即使你这样做,我也非常感谢在networking上的书籍或资源的一些build议,我应该阅读,以了解如何做到这一点。

既然你说你正在使用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 ,它包含许多winapi函数的c# (和vb.net)签名。

例如, SendMessage

 [DllImport("user32.dll", CharSet = CharSet.Auto)] static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam); 

和这个消息代码列表 。

您会注意到所有p / invoke方法都使用System.Runtime.InteropServices命名空间中的DllImport属性。

他们在方法签名中也有一个extern修饰符。 这意味着代码是在当前程序集外部找到的。

然后可以使用SendMessage将消息发送到计算器的句柄。

正如Jonathan在他的评论中提到的那样,您应该使用Spy ++来检测哪些消息正在发送,从而导致您想要复制的操作。

为了更好的衡量, 这里有一篇关于P / Invoke的更多介绍性信息。