Abhijeet P Singh Ответов: 2

Как я могу обнаружить любую клавишу, нажатую в windows, и изменить значение ключа во время выполнения с помощью C#?


Я хочу обнаружить пользовательский ввод в любом месте windows и заменить его своим пользовательским значением. На данный момент я использую крючки для обнаружения нажатия клавиши, но я не могу изменить значение клавиши: например, если пользователь набрал "привет" в блокноте, он хочет заменить его на "Эй! там..."

Что я уже пробовал:

Я использую крючки для обнаружения нажатия клавиши, но я не могу изменить значение клавиши: например, если пользователь набрал "привет" в блокноте, он хочет заменить его на "Эй! там..."

ZurdoDev

Я не уверен, что вы найдете здесь кого-то, кто поможет вам писать вредоносные программы.

Abhijeet P Singh

это будет работать только на прикладном уровне, я хочу сделать это глобально . например, если кто-то набрал 2 в блокноте, то он должен автоматически стать 3

2 Ответов

Рейтинг:
1

Jochen Arndt

Это невозможно сделать, потому что, когда ваш крючок получает первый символ "H", он не знает, являются ли следующие нажатия клавиш "ello". Так что ему все равно придется это пропустить. Как только он узнает, что "Привет" был введен при обработке "о", предшествующие ключи уже переданы.

Также нет разумной цели выполнять такие замены глобально, потому что ваше приложение для подключения не знает о приложении, которое фактически получает ввод с клавиатуры. Он может даже делать что-то нежелательное, когда это приводит к выполнению горячих клавиш.


Abhijeet P Singh

Это не что-то нежелательное. Это очень просто, как текстовый редактор, например, когда в Sublime мы набираем "div#row" и вводим tab, то он меняется на правильный тег div с id=row . Я хочу добиться такой же функциональности на глобальном уровне в windows

Jochen Arndt

Как я тебе и говорил: Вы не можете предсказать, что пользователь вводит.

Вы всегда должны знать, что было введено, а затем можете изменить его в соответствии с правилами sume. Но для этого требуется сделать это на уровне приложения, потому что только приложение имеет, например, доступ к элементу управления редактированием, знает, что там содержится, и может изменить его содержимое.

Abhijeet P Singh

Вы уверены, что это невозможно сделать?

Dave Kreskowiak

Короткий ответ-Нет, не может.

Длинный ответ-да, это возможно, но с большим трудом. Есть еще много чего, что вы должны отслеживать, кроме того, что просто смотрите на нажатия клавиш, пролетающие мимо.

Нет, я не собираюсь описывать его, потому что я не собираюсь помогать в вредоносных программах. Может быть, не вы написали, а кто-то другой, кто приходит на этот пост в поисках чего-то полезного.

Jochen Arndt

Не глобально, если не знать, как данные обрабатываются активным приложением.

После передачи ключей вам придется отменить и вставить новый текст. Поэтому вы должны знать, что было вставлено, где и как это изменить. Это требует отслеживания активного окна, которое получает ключи, и доступа к этому окну для изменения содержимого. Хотя теоретически это возможно, если не предотвращено настройками безопасности, это требует большой работы и имеет большой потенциал злоупотребления и склонно к нежелательным побочным эффектам.

Ваш пример для Sublime здесь не учитывается: он делает это на уровне приложения.

Рейтинг:
0

Manish K. Agarwal

Есть только один способ:

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar >= 48 && e.KeyChar <= 57)
            {
                MessageBox.Show("Form.KeyPress: '" +
                    e.KeyChar.ToString() + "' pressed.");

                switch (e.KeyChar)
                {
                    case (char)50:
                        e.KeyChar = (char)51;
                        break;
                    case (char)49:
                        MessageBox.Show("Form.KeyPress: '" +
                            e.KeyChar.ToString() + "' consumed.");
                        e.Handled = true;
                        break;
                }
            }
        }
    }
}


При нажатии на цифру 2 я меняю ее на 3 и e.Handled оставайтесь ложными.