Двойной ввод с помощью SendKeys

У меня странная проблема с SendKeys.Send

В основном происходит вот что. У меня есть Internet Explorer в фокусе на google.com, и я вызываю SendKeys.Send("TestSample\n"); иногда он отправляет некоторые ключи дважды (например, TeestSample или TestSSSample) непредсказуемым образом. Это происходит примерно в 20% случаев.

Кроме того, когда я включаю пробел в строку SendKeys.Send("Test Sample\n"), это также непредсказуемо, за исключением одного момента. Каждый раз, когда я это делаю, он входит в тестовый образец, выполняет поиск в Google, но также прокручивает страницу результатов, так как я нажал пробел после ввода текста.

Кто-нибудь еще видел это поведение. Кажется, это не работает таким образом, когда блокнот находится в фокусе.

(В качестве иллюстрации приведен пример кода. Поместите его в форму с односекундным таймером, с определениями DllImport в верхней части класса.) Это приложение дает сбой примерно в 20 % случаев при работе с Google.com в Internet Explorer (8.0). )

    [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
    public static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);
    [DllImport("user32.dll")]
    public static extern IntPtr GetForegroundWindow();

    private void timer1_Tick(object sender, EventArgs e)
    {
        IntPtr foreground = GetForegroundWindow();
        if (foreground != _currentForeground)
        {
            _currentForeground = foreground;
            var titleBuilder = new StringBuilder(200);
            GetWindowText(foreground, titleBuilder, 200);
            string title = titleBuilder.ToString();
            Debug.WriteLine("Title of " + title);
            if (title == "Google - Windows Internet Explorer")
            {
                Debug.WriteLine("Sending keys");
                SendKeys.Send("Test Sample\n");
            }
            if (title == "Untitled - Notepad")
                SendKeys.Send("Test notpad sample\n");
            Thread.Sleep(2000);
        }
    }
    private IntPtr _currentForeground = IntPtr.Zero;

person JessicaB    schedule 05.02.2010    source источник
comment
просто наблюдение, но в целом вы должны использовать sendkeys только в крайнем случае, если вы не можете достичь своих целей с помощью какой-либо библиотеки автоматизации   -  person Adam Ralph    schedule 06.02.2010
comment
Вы когда-нибудь находили решение этой проблемы? У меня также есть проблема, когда SendKeys иногда отправляет дважды, но это трудно воспроизвести.   -  person Kris Harper    schedule 21.12.2011
comment
Этот вопрос может быть дубликатом stackoverflow.com/questions/ 2346281/   -  person Oliver Bock    schedule 17.03.2014
comment
Другой является дубликатом, поскольку он старше. Это углубляется в некоторое нежелательное поведение, но, возможно, основная проблема та же самая.   -  person Noman_1    schedule 02.10.2020


Ответы (1)


Возможно, вам будет лучше найти hWnd, в который вы хотите записать новые данные, а затем вызвать SetWindowTextW.

[DllImport( "user32.dll" )]
public static extern int SetWindowTextW( HandleRef hWnd, [MarshalAs( UnmanagedType.LPWStr )] string text );

После этого найдите hWnd кнопки и отправьте WM_LBUTTONDOWN и WM_LBUTTONUP, используя

[DllImport( "user32.dll" )]
public static extern int PostMessage( HandleRef hWnd, WM msg, int wParam, int lParam );

    WM_LBUTTONDOWN = 0x0201
    WM_LBUTTONUP = 0x0202
person JDMX    schedule 22.02.2010