由于 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 函数来发送消息,并等待窗口响应。

WinForms 模拟点击其他软件下拉框 - 使用 Windows API 实现

原文地址: https://www.cveoy.top/t/topic/lC4v 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录