3

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

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

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

4

2 回答 2

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();
 }
}
于 2013-01-01T14:20:26.880 回答
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);

和这个消息代码列表

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

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

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

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

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

于 2013-01-01T07:48:42.537 回答