C# 单击另一个应用程序中的按钮

C# 单击另一个应用程序中的按钮,c#,api,C#,Api,我被绊倒了,我不知道是什么问题。我看到了另一个类似的话题,但对我没有帮助 这是我的密码: foreach (IntPtr se in allchwin) { IntPtr a = SendMessage(se, WM_GETTEXTLENGTH, 0, null); StringBuilder outText = new StringBuilder(a.ToInt32() + 1); SendMessag

我被绊倒了,我不知道是什么问题。我看到了另一个类似的话题,但对我没有帮助

这是我的密码:

  foreach (IntPtr se in allchwin)
        {
            IntPtr a = SendMessage(se, WM_GETTEXTLENGTH, 0, null);
            StringBuilder outText = new StringBuilder(a.ToInt32() + 1);
            SendMessage(se, WM_GETTEXT, outText.Capacity, outText);

            if (outText.ToString() == "Login")
            {

                SendMessage(se, WM_LBUTTONDOWN, 0, null);
                SendMessage(se, WM_LBUTTONUP, 0, null);
                SendMessage(se, BM_CLICK, 0, null);
            }
        }
List(IntPtr)——allchwin:包含程序中搜索“Login”按钮的整个子窗口句柄

我发现“登录”按钮窗口句柄,这是正确的值,我检查了Spy++但命令发送后什么也没有发生。 每个SendMessage命令的返回值都是0。程序窗口位于前台,其中有“登录”按钮。此按钮有一个父窗口,是程序的主窗口

我尝试了FindWindow和FindWindowEx,但结果相似,返回值为0

知道为什么吗?可以让程序保护单击或等?

请检查API

是基于COM的,但是有.net包装器。安装Windows SDK以访问API和托管包装器

要获取按钮,请:

  • 通过句柄查找-请参阅
  • 接下来通过调用类似于
    automationElement.GetCurrentPattern(InvokePattern.Pattern)的内容作为InvokePattern来获取
    InvokePattern
  • 最后一个-调用此模式:
    invokePattern.invoke()

也请检查,可能会有所帮助。

我的WinApi知识有点生疏,但我认为您必须获取要单击的按钮的窗口句柄,并将消息发送到此句柄。否则,您只需“单击”窗口(而不是按钮)。这不是为了解决问题,但我可以问一下您为什么需要这样做吗?对于这个问题,我或其他人可能有一个更简单、更优雅的解决方案。我发现,100%的时候,你需要向自己应用程序的任何控件/窗口发送消息,而你却用了过度设计和艰难的方式。“懒惰”是正确的。在WinForms中,按钮有自己的句柄。在WPF中,情况大不相同。