对于 Winform 应用程序,可以使用 Windows API 来模拟点击别的软件下拉框选择子项。以下是实现的代码示例:

首先,需要引用 Windows API:

using System.Runtime.InteropServices;

然后,定义一些常量和结构体:

private const uint WM_COMMAND = 0x0111;
private const uint CBN_DROPDOWN = 7;
private const uint CBN_SELCHANGE = 1;

[StructLayout(LayoutKind.Sequential)]
public struct POINT
{
    public int X;
    public int Y;
}

[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
    public int Left;
    public int Top;
    public int Right;
    public int Bottom;
}

接着,定义一些 Windows API 函数:

[DllImport("user32.dll", EntryPoint = "FindWindow")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

[DllImport("user32.dll", EntryPoint = "FindWindowEx")]
public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);

[DllImport("user32.dll", EntryPoint = "SendMessage")]
public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

[DllImport("user32.dll", EntryPoint = "PostMessage")]
public static extern bool PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

[DllImport("user32.dll", EntryPoint = "SetForegroundWindow")]
public static extern bool SetForegroundWindow(IntPtr hWnd);

[DllImport("user32.dll", EntryPoint = "GetWindowRect")]
public static extern bool GetWindowRect(IntPtr hwnd, out RECT lpRect);

[DllImport("user32.dll", EntryPoint = "SetCursorPos")]
public static extern bool SetCursorPos(int x, int y);

[DllImport("user32.dll", EntryPoint = "mouse_event")]
public static extern void mouse_event(uint dwFlags, int dx, int dy, uint dwData, int dwExtraInfo);

[DllImport("user32.dll", EntryPoint = "GetCursorPos")]
public static extern bool GetCursorPos(out POINT lpPoint);

最后,实现模拟点击下拉框选择子项的代码:

public void SelectComboBoxItem(IntPtr parentHwnd, string comboBoxClassName, string comboBoxText, string itemText)
{
    // 找到下拉框控件句柄
    IntPtr comboBoxHwnd = FindWindowEx(parentHwnd, IntPtr.Zero, comboBoxClassName, comboBoxText);
    if (comboBoxHwnd == IntPtr.Zero)
    {
        return;
    }

    // 发送 CBN_DROPDOWN 消息打开下拉框
    SendMessage(comboBoxHwnd, WM_COMMAND, (IntPtr)CBN_DROPDOWN, IntPtr.Zero);

    // 等待下拉框弹出
    Thread.Sleep(500);

    // 找到下拉框列表句柄
    IntPtr listBoxHwnd = FindWindowEx(IntPtr.Zero, comboBoxHwnd, "ListBox", null);
    if (listBoxHwnd == IntPtr.Zero)
    {
        return;
    }

    // 找到下拉框列表中要选择的子项
    IntPtr itemHwnd = FindWindowEx(listBoxHwnd, IntPtr.Zero, "ListBoxItem", itemText);
    if (itemHwnd == IntPtr.Zero)
    {
        return;
    }

    // 获取下拉框列表的位置信息
    RECT rect;
    GetWindowRect(listBoxHwnd, out rect);

    // 计算要点击的子项的位置
    POINT pt;
    GetCursorPos(out pt);
    pt.X = rect.Left + 10;
    pt.Y = rect.Top + 10;

    // 移动鼠标并点击子项
    SetCursorPos(pt.X, pt.Y);
    mouse_event(0x0002, pt.X, pt.Y, 0, 0);
    mouse_event(0x0004, pt.X, pt.Y, 0, 0);

    // 发送 CBN_SELCHANGE 消息关闭下拉框
    SendMessage(comboBoxHwnd, WM_COMMAND, (IntPtr)CBN_SELCHANGE, itemHwnd);
}

调用方式:

IntPtr parentHwnd = FindWindow(null, "应用程序标题");
SelectComboBoxItem(parentHwnd, "ComboBox", null, "要选择的子项");

其中,第一个参数是父窗口句柄,第二个参数是下拉框控件的类名,第三个参数是下拉框的文本内容,第四个参数是要选择的子项的文本内容。如果下拉框的文本内容为空,则可以将第三个参数传入 null。

Winform 模拟点击其他软件下拉框选择子项代码

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

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