Установить элемент DateTimePicker через AutomationElement - PullRequest
3 голосов
/ 17 февраля 2012

Я хочу иметь возможность установить элемент DateTimePicker на определенное время с помощью AutomationElement. Он хранит время как «чч: мм: сс тт» (т.е. 10:45:56 вечера).

Я получаю элемент как таковой:

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). Второй вариант говорит мне, что элемент только для чтения, как я могу изменить статус, чтобы он не только для чтения? Или, проще говоря, как я могу изменить время :(?

1 Ответ

1 голос
/ 16 февраля 2018

Вы можете получить дескриптор собственного окна и отправить сообщение DTM_SETSYSTEMTIME, чтобы установить выбранную дату для элемента управления DateTimePicker.

Для этого, я полагаю, вы нашли элемент, затем вы можете использовать follwingкод:

var date =  new DateTime(1998, 1, 1);
DateTimePickerHelper.SetDate((IntPtr)element.Current.NativeWindowHandle, date);

DateTimePickerHelper

Вот исходный код для 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);
    }
}
...