Отправка письма 'i' с SendKeys

Я сделал экранную клавиатуру с C# Windows Forms. Я использую Sendkeys.Send() функция для отправки нажатий клавиш. Все буквы, кроме буквы Я работает нормально. Когда я нажимаю на букву Я на клавиатуре, когда Microsoft Word открыт, он посылает Ctrl + Alt + Я и открывает диалоговое окно "печать". То же самое и в Notepad++. Но он отлично работает, когда я пытаюсь ввести Блокнот.

в моем коде я посылаю ключи с SendKeys.Send(value); где value-текст нажатой кнопки. Я получаю текст со следующим кодом:

string s = ((Button)sender).Text;

какие-либо комментарии о том, почему он не работает должным образом?

Edit: я создал новый проект windows forms только с помощью кнопки, и весь код ниже. Все еще не работает. Любые идеи будут оценены.

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            SendKeys.Send("i");
        }

        // Prevent form being focused
        const int WS_EX_NOACTIVATE = 0x8000000;
        protected override CreateParams CreateParams
        {
            get
            {
                CreateParams ret = base.CreateParams;
                ret.ExStyle |= WS_EX_NOACTIVATE;
                return ret;
            }
        }  
    }

переопределенная функция заключается в предотвращении фокусировки формы. Так что я могу отправить нажатия клавиш в другое приложение, которое имеет центр тяжести.

2 ответов


два варианта:

1- Имитирует нажатие клавиши, см. http://msdn2.microsoft.com/en-us/library/system.windows.forms.sendkeys(VS.71).aspx

пример:

public static void ManagedSendKeys(string keys)
        {
            SendKeys.SendWait(keys);
            SendKeys.Flush();
        }

2-отправляет ключ в окно, нажав на кнопку в течение x секунд

[DllImport("user32.dll")]
public static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, UIntPtr dwExtraInfo);
public static void KeyboardEvent(Keys key, IntPtr windowHandler, int delay)
        {
            const int KEYEVENTF_EXTENDEDKEY = 0x1;
            const int KEYEVENTF_KEYUP = 0x2;
            keybd_event((byte)key, 0x45, KEYEVENTF_EXTENDEDKEY, (UIntPtr)0);
            Thread.Sleep(delay);
            keybd_event((byte)key, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, (UIntPtr)0);
        }

вы не вызываете метод Win32 API" SetForegroundWindow". Поэтому ваш вызов "SendKeys", скорее всего, отправляет ключи в ваше приложение, а не целевое приложение, как предполагалось.

вот пример на MSDN:

эмуляция мыши и клавиатуры в код

кроме того, вот код из примера:

using System;
using System.Runtime.InteropServices;
using System.Drawing;
using System.Windows.Forms;

namespace SimulateKeyPress
{
    class Form1 : Form
    {
        private Button button1 = new Button();

        [STAThread]
        public static void Main()
        {
            Application.EnableVisualStyles();
            Application.Run(new Form1());
        }

        public Form1()
        {
            button1.Location = new Point(10, 10);
            button1.TabIndex = 0;
            button1.Text = "Click to automate Calculator";
            button1.AutoSize = true;
            button1.Click += new EventHandler(button1_Click);

            this.DoubleClick += new EventHandler(Form1_DoubleClick);
            this.Controls.Add(button1);
        }

        // Get a handle to an application window.
        [DllImport("USER32.DLL", CharSet = CharSet.Unicode)]
        public static extern IntPtr FindWindow(string lpClassName,
            string lpWindowName);

        // Activate an application window.
        [DllImport("USER32.DLL")]
        public static extern bool SetForegroundWindow(IntPtr hWnd);

        // Send a series of key presses to the Calculator application.
        private void button1_Click(object sender, EventArgs e)
        {
            // Get a handle to the Calculator application. The window class
            // and window name were obtained using the Spy++ tool.
            IntPtr calculatorHandle = FindWindow("CalcFrame","Calculator");

            // Verify that Calculator is a running process.
            if (calculatorHandle == IntPtr.Zero)
            {
                MessageBox.Show("Calculator is not running.");
                return;
            }

            // Make Calculator the foreground application and send it 
            // a set of calculations.
            SetForegroundWindow(calculatorHandle);
            SendKeys.SendWait("111");
            SendKeys.SendWait("*");
            SendKeys.SendWait("11");
            SendKeys.SendWait("=");
        }

        // Send a key to the button when the user double-clicks anywhere 
        // on the form.
        private void Form1_DoubleClick(object sender, EventArgs e)
        {
            // Send the enter key to the button, which raises the click 
            // event for the button. This works because the tab stop of 
            // the button is 0.
            SendKeys.Send("{ENTER}");
        }
    }
}