在c#中使用win32 API操作简单的windows计算器



嗯,我已经尽了最大的努力去看代码示例,并在网上发布了关于如何做到这一点的帖子,但是几个月来我一直没有能够使用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的更多介绍性信息的文章。

最新更新