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

时间:2013-01-01 07:33:46

标签: c# windows api winapi

好吧,我已经尽力查看代码示例并在网上发布关于如何执行此操作的帖子,但是在几个月内我无法使用Windows API与其他人进行交互。已经运行的程序。我不是最伟大的程序员,其中一些东西超出了我。

我能做的最多就是找到计算器进程及其句柄,并使用它与SetWindowText来更改标题。我真正想要学习的是让我的程序使用windows user32(我认为这必须是正确的库)通过实际按下软件计算器上的数字键按钮来输入一些数字来进行简单的计算。

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

2 个答案:

答案 0 :(得分:8)

由于您说您正在使用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();
 }
}

答案 1 :(得分:2)

您正在进入平台调用的有趣世界(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);

list of message codes

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

他们在方法签名中也有extern修饰符。这意味着代码可以在当前程序集之外找到。

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

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

为了更好地衡量,here是一篇文章,其中包含有关P / Invoke的更多介绍性信息。