Winform 模拟点击其他软件下拉框选择子项代码
对于 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。
原文地址: https://www.cveoy.top/t/topic/lC5b 著作权归作者所有。请勿转载和采集!