Двойной набор клавиш с помощью SendKeys - PullRequest
4 голосов
/ 05 февраля 2010

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

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

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

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

(Для иллюстрации приведен пример кода. Поместите его в форму с секундным таймером в форме с определениями DllImport в верхней части класса.) Это приложение дает сбой примерно в 20% случаев с Google.com в Интернете 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;

1 Ответ

0 голосов
/ 23 февраля 2010

Возможно, вам лучше будет найти ключ, в который вы хотите записать новые данные, и затем вызвать 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
...