Отправка письма "я" с помощью SendKeys
Я сделал экранную клавиатуру с C# Windows Forms. я использую Sendkeys.Send()
функция для отправки нажатий клавиш. Все буквы кроме буквы у меня отлично работают. Когда я нажимаю букву i на клавиатуре, когда Microsoft Word открыт, он отправляет Ctrl + Alt + I и открывает диалоговое окно печати. То же самое и в Notepad++. Но он отлично работает, когда я пытаюсь набрать в блокноте.
В моем коде я отправляю ключи с SendKeys.Send(value);
где значение - это текст кнопки, которая была нажата. Я получаю текст со следующим кодом:
string s = ((Button)sender).Text;
Любые комментарии о том, почему это не работает должным образом?
Редактировать: я создал новый проект 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- Посылает ключ в окно, нажимая кнопку в течение х секунд
[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}");
}
}
}