MSDN.WhiteKnight - Stack Overflow answers
Ответ на "Проблемы с кодировкой c# sendkeys"
Answer 797931
Это никак не связано с кодировкой. Дело в том, что в Windows раскладка клавиатуры задается на уровне потоков. По некоторым причинам, SendKeys работает некорректно, если для потока, которому принадлежит целевое окно, установлена другая раскладка, чем для текущего потока - либо для русских, либо для английских букв будет генерироваться сообщение с несоответствующим скан-кодом.
Эту проблему можно решить, изменив раскладку текущего потока так, чтобы они совпадали:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Runtime.InteropServices; using System.Text; using System.Diagnostics; using System.Windows.Forms; namespace WindowsFormsTest1 { public partial class Form1 : Form { [DllImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] static extern bool SetForegroundWindow(IntPtr hWnd); [DllImport("user32.dll", SetLastError = true)] static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId); [DllImport("user32.dll")] static extern IntPtr GetKeyboardLayout(uint thid); [DllImport("user32.dll", SetLastError = true)] internal static extern IntPtr ActivateKeyboardLayout(IntPtr hkl, uint Flags); public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Process pr = Process.GetProcessesByName("notepad")[0]; IntPtr hwnd = pr.MainWindowHandle; //получение идентификатора потока целевого окна uint dummy = 0; uint thid = GetWindowThreadProcessId(hwnd, out dummy); //смена раскладки клавиатуры на раскладку целевого окна IntPtr id = GetKeyboardLayout(thid); ActivateKeyboardLayout(id, 0); SetForegroundWindow(hwnd);//передаем фокус окну SendKeys.Send("Hello, мир");//теперь должно сработать } } }
Content is retrieved from StackExchange API.
Auto-generated by ruso-archive tools.