C# Win32API-通过适配器单击Winform应用程序上的按钮

C# Win32API-通过适配器单击Winform应用程序上的按钮,c#,winforms,winapi,adapter,C#,Winforms,Winapi,Adapter,我需要使用win32Api通过适配器单击windows窗体应用程序按钮 我在windows窗体屏幕上找到了使用此代码的按钮 childHwnd = Win32API.FindWindowByPosition(ptr, new Point(intbtnx, intbtny)); 现在我需要自动点击这个按钮。我不知道怎么做。需要帮忙吗 到目前为止,我已经写了这篇文章,但它只获取了我需要单击的按钮 childHwnd = Win32API.FindWindowByPosit

我需要使用win32Api通过适配器单击windows窗体应用程序按钮

我在windows窗体屏幕上找到了使用此代码的按钮

        childHwnd = Win32API.FindWindowByPosition(ptr, new Point(intbtnx, intbtny));
现在我需要自动点击这个按钮。我不知道怎么做。需要帮忙吗

到目前为止,我已经写了这篇文章,但它只获取了我需要单击的按钮

     childHwnd = Win32API.FindWindowByPosition(ptr, new Point(intPwdx, intPwdy));

需要单击childHwnd中可用的按钮

您可以为此使用
发送消息
API

[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr SendMessage(IntPtr hWnd, uint msg, int wParam, int lParam);

private const uint BM_CLICK = 0x00F5;

SendMessage(childHwnd, BM_CLICK, 0, 0); 
我应该注意的是,您不会看到按钮的单击动画,它仅在您实际单击按钮时出现。
但是,它应该从其单击事件执行代码

编辑
在注释中,OP要求将发送消息延迟5秒,而不冻结应用程序。
一个简单的解决办法是

从VS中的
工具箱
中,在表单上放置一个
计时器
组件

将其属性
Interval
设置为
5000

将其属性
Enabled
设置为true
双击事件勾选,并将此代码写入其中

private void timer1_Tick(object sender, EventArgs e)
{
     timer1.Enabled = false; // write this if you only want this to happen once
     SendMessage(childHwnd, BM_CLICK, 0, 0); 
}

可能是错误的方法。谢谢你的回复。但这给了我一个错误。私人建筑BM_CLICK=0x00F5;它应该有一个返回类型我没有得到那个错误,你能编辑你的问题,把给出这个错误的确切代码放在那里吗?为什么否决?这可能不是最好的办法,但这确实回答了OPI没有投反对票的问题。但我能纠正这个错误。我删除了private,它工作得很好。你能告诉我这个代码背后的逻辑吗?这里没有多少逻辑。SendMessage功能将在按钮的消息队列中放置一个
单击
请求。按钮将通过执行其
onClick
事件作出反应。就这样