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