Не срабатывает SendKeys при повторном нажатии горячих клавиш - C#
Формулировка задачи:
Здравствуйте, не срабатывает SendKeys при повторном нажатии горячих клавиш. Я понимаю, что дело в скорости обработки сообщений WinAPI, можно включить Thread.Sleep(300)
, но это заметно тормозит выполнение программы и не дает решения ситуации т.к. может повторится если усердно нажимать гор.клав. Я пробовал использовать SendKeys через button - работает стабильно , но через хоты не получается, делал через свойство и метод - срабатывает один раз, ставил Наврное смешно и тоже срабатывает только один раз. Делал через событие т.е нажимаю гор.клав. срабатывает событие включается обработчик и SendKeys но результат тот же. Охраняемый блок тоже не помогает Исключения не выдает. Подскжите направление. вот код
void FocusedSelect()
{
bool state = RegisterHotKey(this.Handle, atom, 0x0002, 0x09);
}
protected override void WndProc(ref Message m)
{
if (m.Msg == 0x0312) //WM_HOTKEY
{
//Thread.Sleep(300);
//MessageBox.Show("TATATATTA");
handle = GetForegroundWindow();
SendKeys.Send("HeLlo!!!");
SendKeys.SendWait("HeLlo!!!");
UnregisterHotKey(this.Handle, atom);
GlobalDeleteAtom(atom);
FocusedSelect();
}
base.WndProc(ref m);
}using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Diagnostics;
using System.Threading;
namespace EmulatorKey
{
public partial class Form1 : Form
{
[DllImport("user32.dll")]
static extern IntPtr GetFocus();
[DllImport("user32.dll")]
public static extern IntPtr GetForegroundWindow();
[DllImport("user32.dll")]
public static extern IntPtr SetForegroundWindow(IntPtr hWnd);
[DllImport("User32.dll")]
public static extern bool RegisterHotKey(IntPtr hWnd, int id, uint fsModifiers, uint vk);
[DllImport("User32.dll")]
public static extern bool UnregisterHotKey(IntPtr hWnd, int id);
[DllImport("kernel32.dll")]
public static extern Int16 GlobalAddAtom(string name);
[DllImport("kernel32.dll")]
public static extern Int16 GlobalDeleteAtom(Int16 nAtom);
[DllImport("user32.dll")]
public static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, int dwExtraInfo);
Int16 atom = GlobalAddAtom("PFight");
// IntPtr handle;
// int count = 0;
// public delegate void CarDelegate(IntPtr Hnd);
// public static event CarDelegate MaxSpeed;
public Form1()
{
bool state = RegisterHotKey(this.Handle, atom, 0x0002, 0x09);
InitializeComponent();
this.FormClosing += new FormClosingEventHandler(Form1_FormClosing);
//Form1.MaxSpeed += new CarDelegate(FocusedSelect);
}
void FocusedSelect()
{
//MessageBox.Show("TATATATTA");
// SetForegroundWindow(handle);
//SendKeys.SendWait("Hello!!!");
}
void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
UnregisterHotKey(this.Handle, atom);
GlobalDeleteAtom(atom);
}
[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")]
protected override void WndProc(ref Message m)
{
if (m.Msg == 0x0312) //WM_HOTKEY
{
//Thread.Sleep(300);
//MessageBox.Show("TATATATTA");
handle = GetForegroundWindow();
// SetForegroundWindow(handle);
//MaxSpeed(handle);
SendKeys.Send("HeLlo!!!");
SendKeys.SendWait("HeLlo!!!");
count++;
}
base.WndProc(ref m);
}
public IntPtr GetHandle()
{
return handle;
}
private void button1_Click(object sender, EventArgs e)
{
IntPtr Handle = GetHandle();
SetForegroundWindow(Handle);
SendKeys.SendWait("Hello!!!");
}
}
}Решение задачи: «Не срабатывает SendKeys при повторном нажатии горячих клавиш»
textual
Листинг программы
using System;
using System.ComponentModel;
using System.Runtime.InteropServices;
using System.Threading;
using System.Windows.Forms;
namespace Translit
{
public partial class Form1 : Form
{
[DllImport("User32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool RegisterHotKey(IntPtr hWnd, int id, uint fsModifiers, uint vk);
[DllImport("User32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool UnregisterHotKey(IntPtr hWnd, int id);
[DllImport("kernel32.dll", SetLastError = true)]
public static extern ushort GlobalAddAtom(string name);
[DllImport("kernel32.dll", SetLastError = true)]
public static extern ushort GlobalDeleteAtom(ushort nAtom);
[DllImport("user32.dll", SetLastError = true)]
public static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, int dwExtraInfo);
ushort atom;
public Form1()
{
InitializeComponent();
atom = GlobalAddAtom("PFight");
if (!RegisterHotKey(this.Handle, atom, 0x0002, 0x9))//ctrl+tab
throw new Win32Exception(Marshal.GetLastWin32Error());
this.FormClosed += new FormClosedEventHandler(Form1_FormClosed);
}
void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
UnregisterHotKey(this.Handle, atom);
GlobalDeleteAtom(atom);
}
protected override void WndProc(ref Message m)
{
if (m.Msg == 0x0312)
{
CopyEmul();
Thread.Sleep(50);
GetBuffer();
ReChars();
SetBuff();
PasteEmul();
}
base.WndProc(ref m);
}
/// <summary>
/// Копируем в буфер выделенный текст
/// </summary>
void CopyEmul()
{
keybd_event(0x11 /* VK_CONTROL */, 0, 0, 0);
keybd_event((byte)'C', 0, 0, 0);
keybd_event((byte)'C', 0, 0x2 /* KEYEVENTF_KEYUP */, 0);
keybd_event(0x11, 0, 0x2, 0);
}
/// <summary>
/// Вставляем в буфер выделенный текст
/// </summary>
void PasteEmul()
{
keybd_event(0x11 /* VK_CONTROL */, 0, 0, 0);
keybd_event((byte)'V', 0, 0, 0);
keybd_event((byte)'V', 0, 0x2 /* KEYEVENTF_KEYUP */, 0);
keybd_event(0x11, 0, 0x2, 0);
}
/// <summary>
/// Получение информации из буфера в переменную richTextBox1.Text
/// </summary>
void GetBuffer()
{
richTextBox1.Text = ClipboardApi.GetText(this.Handle);
}
/// <summary>
/// Замена символов в переменной richTextBox1.Text с русских на агл. и наоборот, результат в richTextBox1.Text
/// </summary>
void ReChars()
{
richTextBox1.Text = new Charsi(richTextBox1.Text).Coding();
}
/// <summary>
/// Вставка в буфер значения переменной richTextBox1.Text
/// </summary>
void SetBuff()
{
ClipboardApi.SetText(this.Handle, richTextBox1.Text);
}
private void button1_Click ( object sender, EventArgs e ) {
}
}
}