Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 1
Регистрация: 15.12.2019
Сообщений: 107

Почему программное нажатие сочетания клавиш работает не во всех окнах?

18.05.2022, 14:05. Показов 493. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Имеется код, который при нажатии определенной клавиши/сочетания клавиш прогарммно нажимает сочетание клавиш CTRL+A (Выделить текст в строке).


Проблема:

Все отлично работает в блокноте, браузере, в командной строке и других окнах, но не работает с текстовыми полями в играх (например, Dota 2, CS:GO).

То есть, когда я нажимаю G (кнопка для вызова CTRL+A)вообще ничего не происходит. При этом функция нажатия CTRL+A вызывается, то есть клавиша G не перехватывается игрой.


Так или иначе, например этот код на Python отлично работает и в браузере и в игре, при этом даже не перехватывая клавишу из других программ:

Python
1
2
3
import keyboard
keyboard.add_hotkey('G', callback=lambda: keyboard.press_and_release('ctrl+a'))
keyboard.wait()

Насколько я знаю, он тоже ссылается к user32.dll, но не к SendInput, а к keybd_event, хотя я попробовал и то и другое - не работает. При этом код на Python работает, а на C# - нет.

Вот исходник функции keyboard.press_and_release() (477 строка), которая ссылается на функцию `send()`.


Код:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
using System;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;
 
namespace Test
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            // при нажатии на кнопку G программа нажмет CTRL+A 
            NHotkey.Wpf.HotkeyManager.Current.AddOrReplace("G", Key.G, ModifierKeys.None, (sender, e) => { PressCtrlA(sender, e); });
        }
 
        // метод для ожидания освобождения всех клавиш клавиатуры
        // чтобы программное нажатие CTRL+A сработало корректно
        private static readonly Key[] keys = Enum.GetValues(typeof(Key)).Cast<Key>().Where(key => key != Key.None).ToArray();
        private async Task WaitForKeysReleaseAsync()
        {
            int threshold = 0;
            while (Keyboard.Modifiers != ModifierKeys.None || keys.Any(key => Keyboard.IsKeyDown(key)))
            {
                if (threshold++ == 100) // ~5 секунд
                    throw new TimeoutException("Keyboard release timed out or stuck keys");
                await Task.Delay(50);
            }
        }
 
        // подождать пока освободится клавиатура и нажать CTRL+A
        private async void PressCtrlA(object sender, EventArgs e)
        {
            await WaitForKeysReleaseAsync();
            KeyboardManager.PressHotkey(Key.A, ModifierKeys.Control);
        }
    }
}

В коде используется класс `KeyboardManager` для программного нажатия клавиш, вот код от него: https://pastebin.com/xRtv3drq
Также используется пакет `NHotkey.Wpf`
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.05.2022, 14:05
Ответы с готовыми решениями:

Нажатие клавиш вне формы (глобальный перехват сочетания клавиш)
Всем доброго времени суток! Задумал сделать значок раскладки клавы, но беда в том, что если потерян фокус приложения, то значок не...

Программное нажатие кнопок в диалоговых окнах Webbrowser
Доброго времени суток! При переходе по ссылке в Webbrowser, сначала появляется окошко и при нажатии &quot;Да&quot; появляется окошко...

Нажатие сочетания клавиш из программы
Хочу создать программу, которая сама будет нажимать сочетание клавиш Ctrl + Shift + L через определенный промежуток времени бесконечное...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.05.2022, 14:05
Помогаю со студенческими работами здесь

Определить нажатие сочетания клавиш
Доброго времени суток. У меня в коде есть такая переменная: Dim key As Boolean = False key = GetAsyncKeyState(Keys.CapsLock) ...

Отловить нажатие сочетания клавиш
Доброго времени суток. К примеру, нужно реализовать событие после нажатия двух клавиш одновременно: if (key1 = #10) and (key2 = #11) ...

Как послать нажатие сочетания клавиш?
Привет всем! Кто знает как послать нажатие сочетания клавиш (например, Alt+Down). Пробовал SendMessage Rezult.hWnd, WM_KEYDOWN, 40&amp;,...

Отловить нажатие сочетания клавиш глобально
Например, Alt + PrintScreen. При этом программа сидит в трее (активно другое окно).

Обработка события: нажатие сочетания клавиш
Подскажите, пожалуйста, как на JavaScript обработать событие «нажатие сочетания клавиш». Например, чтобы по нажатию Ctrl+Enter запускалась...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru