我希望能够通过
DateTimePicker
将 AutomationElement
元素设置为特定时间。它将时间存储为“hh:mm:ss tt”(即 10:45:56 PM)。
我得到这样的元素:
ValuePattern p = AECollection[index].GetCurrentPattern(ValuePattern.Pattern) as ValuePattern;
我相信我有两个选择:
p.SetValue("9:41:22 AM");
或
p.Current.Value = "9:41:22 AM";
但是,第一个选项根本不起作用(我在某处读到这可能在 .NET 2.0 中被破坏?,尽管我正在使用 .NET 3.0)。第二个选项告诉我该元素是只读的,如何更改状态以使其不是只读的?或者更简单地说,我怎样才能改变时间:(?
您可以获取本机窗口句柄并发送
DTM_SETSYSTEMTIME
消息来设置DateTimePicker
控件的选定日期。
为此,我想您已经找到了该元素,那么您可以使用以下代码:
var date = new DateTime(1998, 1, 1);
DateTimePickerHelper.SetDate((IntPtr)element.Current.NativeWindowHandle, date);
日期时间选择器助手
这是
DateTimePickerHelper
的源代码。该类有一个公共静态 SetDate
方法,允许您为日期时间选择器控件设置日期:
using System;
using System.Runtime.InteropServices;
public class DateTimePickerHelper {
const int GDT_VALID = 0;
const int DTM_SETSYSTEMTIME = (0x1000 + 2);
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
struct SYSTEMTIME {
public short wYear;
public short wMonth;
public short wDayOfWeek;
public short wDay;
public short wHour;
public short wMinute;
public short wSecond;
public short wMilliseconds;
}
[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern IntPtr SendMessage(IntPtr hWnd, int msg,
int wParam, SYSTEMTIME lParam);
public static void SetDate(IntPtr handle, DateTime date) {
var value = new SYSTEMTIME() {
wYear = (short)date.Year,
wMonth = (short)date.Month,
wDayOfWeek = (short)date.DayOfWeek,
wDay = (short)date.Day,
wHour = (short)date.Hour,
wMinute = (short)date.Minute,
wSecond = (short)date.Second,
wMilliseconds = 0
};
SendMessage(handle, DTM_SETSYSTEMTIME, 0, value);
}
}
此解决方案适用于基于 Wpf 的应用程序
object patternObj = AECollection[index].GetCurrentPattern(UIA.UIA_PatternIds.UIA_ValuePatternId);
if (patternObj != null) {
(UIA.IUIAutomationValuePattern)patternObj.SetValue(itemVal);
}
我来这里是因为我遇到了同样的问题。
我尝试通过以下方式设置 DateTimePicker 日期:
您必须先聚焦应用程序窗口,然后聚焦 DateTimePicker,然后使用 SendKeys.SendWait 方法输入日期。
来源:
这是使用 FlaUI 包的示例代码:
// This code uses the FlaUI package to retrieve the element
var automationId = "AUTOMATION ID OF YOUR DATETIME PICKER";
var process = Process.GetProcesses().First(p => p.MainWindowTitle.Contains("YOUR APPLICATION WINDOW TITLE"));
var application = Application.Attach(process.Id);
var appWindow = application.GetMainWindow(new UIA3Automation(), TimeSpan.FromSeconds(10));
var dateTimePicker = appWindow.FindFirstDescendant(cf => cf.ByAutomationId(automationId));
var targetTime = DateTime.Parse("13.04.2024 08:00");
appWindow.Focus();
datePicker.Focus();
SendKeys.SendWait("^{HOME}");
SendKeys.SendWait($"{targetTime:dd}");
SendKeys.SendWait("{RIGHT}");
SendKeys.SendWait($"{targetTime:MM}");
SendKeys.SendWait("{RIGHT}");
SendKeys.SendWait($"{targetTime:yyyy}");
SendKeys.SendWait("{RIGHT}");
SendKeys.SendWait($"{targetTime:HH}");
SendKeys.SendWait("{RIGHT}");
SendKeys.SendWait($"{targetTime:ss}");
我知道示例代码可以简化,但这就是它在我的机器上的工作方式。
因此,我将其原样发布在这里。我希望这有帮助。