Не срабатывает 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 ) { } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д