SendKeys.SendWait на английском, когда клавиатура установлена ​​на другой язык - PullRequest
1 голос
/ 19 марта 2019

В моем application я использую SendKeys.SendWait для отправки text на экран:

SendKeys.SendWait("password");

text включен English, но когда клавиатура установлена ​​на другой язык, text, что SendKeys.SendWait тип установлен на другом языке, а не в English

Любые предложения, как убедиться, что text будет установлен только в English?

1 Ответ

0 голосов
/ 19 марта 2019

Я сделал быстрый тест, используя SendKeys.Send для отправки текста на пару полей ввода. Он отправляет один и тот же текст независимо от того, есть ли у меня клавиатура на английском или другом языке, поэтому я не уверен, почему вы видите другой результат. Пример:

SendKeys.Send("username");
SendKeys.Send("{TAB}");
SendKeys.Send("påsswørd");
SendKeys.SendWait("{ENTER}");

Одна из возможностей заключается в том, что вы можете временно изменить клавиатуру на английский перед вызовом SendKeys, а затем вернуть ее на прежнее значение. Отличный пример техники в этом ответе .

Другой вариант - использовать функции Win32 API для отправки сообщений в окно. Проблема будет в том, как найти правильные окна для отправки текста. Я не уверен, что это можно сделать надежно. Вот пример (не проверенный):

using System.Runtime.InteropServices;

[DllImport("user32.dll")]
static extern IntPtr GetForegroundWindow();

[DllImport("user32.dll")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

[DllImport("user32.dll")]
public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);

[DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int wMsg, int wParam, string lParam);

// Windows message constants
const int WM_SETTEXT = 0x000C;

public void DoLogin(string username, string password)
{
    // Get handle for current active window
    IntPtr hWndMain = GetForegroundWindow();

    if (!hWndMain.Equals(IntPtr.Zero))
    {
        IntPtr hWnd;

        // Here you would need to find the username text input window
        if ((hWnd = FindWindowEx(hWndMain, IntPtr.Zero, "UserName", "")) != IntPtr.Zero)
            // Send the username text to the active window
            SendMessage(hWnd, WM_SETTEXT, 0, username);

        // Here you would need to find the password text input window
        if ((hWnd = FindWindowEx(hWndMain, IntPtr.Zero, "Password", "")) != IntPtr.Zero)
            // Send the password text
            SendMessage(hWnd, WM_SETTEXT, 0, password);

        // Send ENTER key to invoke login
        SendKeys.SendWait("{ENTER}");
    }
}
...