WinForms 模拟点击其他软件下拉框 - 使用 Windows API 实现
由于 WinForms 不支持模拟点击其他软件的下拉框,因此需要使用 Windows API 来实现。
以下是实现模拟点击其他软件下拉框的代码:
using System;
using System.Runtime.InteropServices;
using System.Threading;
using System.Windows.Forms;
public partial class Form1 : Form
{
// 定义 Windows API
[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("user32.dll", SetLastError = true)]
private static extern bool PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
[DllImport("user32.dll", SetLastError = true)]
private static extern bool SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
[DllImport("user32.dll", SetLastError = true)]
private static extern IntPtr GetDlgItem(IntPtr hDlg, int nIDDlgItem);
[DllImport("user32.dll")]
private static extern bool GetComboBoxInfo(IntPtr hwndCombo, ref COMBOBOXINFO pcbi);
// 定义常量
private const uint WM_LBUTTONDOWN = 0x0201;
private const uint WM_LBUTTONUP = 0x0202;
private const uint WM_COMMAND = 0x0111;
private const int CB_SHOWDROPDOWN = 0x014F;
private const int CBN_DROPDOWN = 7;
// 定义结构体
[StructLayout(LayoutKind.Sequential)]
private struct RECT
{
public int left;
public int top;
public int right;
public int bottom;
}
[StructLayout(LayoutKind.Sequential)]
private struct COMBOBOXINFO
{
public int cbSize;
public RECT rcItem;
public RECT rcButton;
public int stateButton;
public IntPtr hwndCombo;
public IntPtr hwndEdit;
public IntPtr hwndList;
}
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
// 获取下拉框句柄
IntPtr hwndComboBox = FindWindow(null, 'ComboBox Window');
if (hwndComboBox != IntPtr.Zero)
{
// 获取下拉框信息
COMBOBOXINFO pcbi = new COMBOBOXINFO();
pcbi.cbSize = Marshal.SizeOf(pcbi);
GetComboBoxInfo(hwndComboBox, ref pcbi);
// 模拟点击下拉框按钮
PostMessage(hwndComboBox, WM_LBUTTONDOWN, IntPtr.Zero, IntPtr.Zero);
PostMessage(hwndComboBox, WM_LBUTTONUP, IntPtr.Zero, IntPtr.Zero);
// 等待下拉框弹出
Thread.Sleep(500);
// 获取下拉框列表句柄
IntPtr hwndList = pcbi.hwndList;
if (hwndList != IntPtr.Zero)
{
// 获取下拉框列表子项句柄
IntPtr hwndListItem = GetDlgItem(hwndList, 0);
if (hwndListItem != IntPtr.Zero)
{
// 模拟选择下拉框列表子项
SendMessage(hwndComboBox, CB_SHOWDROPDOWN, (IntPtr)1, IntPtr.Zero);
PostMessage(hwndListItem, WM_LBUTTONDOWN, IntPtr.Zero, IntPtr.Zero);
PostMessage(hwndListItem, WM_LBUTTONUP, IntPtr.Zero, IntPtr.Zero);
SendMessage(hwndComboBox, WM_COMMAND, (IntPtr)CBN_DROPDOWN, hwndListItem);
}
}
}
}
}
在上面的代码中,我们使用了以下 Windows API:
FindWindow:用于查找窗口句柄。PostMessage:用于发送消息给窗口。SendMessage:用于发送消息给窗口,并等待窗口响应。GetDlgItem:用于获取窗口的指定子项句柄。GetComboBoxInfo:用于获取下拉框信息。
我们首先通过 FindWindow 函数查找下拉框的句柄,然后使用 GetComboBoxInfo 函数获取下拉框的信息。接着,我们模拟点击下拉框按钮,等待下拉框弹出,并获取下拉框列表句柄。如果列表句柄存在,我们就获取列表子项句柄,然后模拟选择列表子项并发送 WM_COMMAND 消息。
需要注意的是,由于模拟点击下拉框按钮和选择列表子项都需要一定的时间,因此我们在模拟点击下拉框按钮后使用 Thread.Sleep 函数等待一段时间,以确保下拉框已经弹出。另外,由于模拟选择列表子项需要等待窗口响应,因此我们使用了 SendMessage 函数来发送消息,并等待窗口响应。
原文地址: https://www.cveoy.top/t/topic/lC4v 著作权归作者所有。请勿转载和采集!