Не срабатывает SendKeys при повторном нажатии горячих клавиш - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте, не срабатывает SendKeys при повторном нажатии горячих клавиш. Я понимаю, что дело в скорости обработки сообщений WinAPI, можно включить Thread.Sleep(300) , но это заметно тормозит выполнение программы и не дает решения ситуации т.к. может повторится если усердно нажимать гор.клав. Я пробовал использовать SendKeys через button - работает стабильно , но через хоты не получается, делал через свойство и метод - срабатывает один раз, ставил
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);

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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4 из 5
Похожие ответы