Регулярное выражение в строке - PullRequest
0 голосов
/ 24 сентября 2019

Я пытаюсь написать кейлоггер с намерением просто получить числа с плавающей точкой с клавиатуры и с их помощью вычислить некоторую формулу и отобразить ее пользователю.Мой код до сих пор (часть HookCallBack)

 private static IntPtr HookCallback(
            int nCode, IntPtr wParam, IntPtr lParam)
        {

            string xxx = "";
            if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
            {
                int vkCode = Marshal.ReadInt32(lParam);   


                if (((Keys)vkCode).ToString() == "OemPeriod")
                {
                    //Console.Out.Write(".");
                    xxx += ".";
                    xxx.Replace("OemPeriod", ".");
                }
                if (((Keys)vkCode).ToString() == "D1")
                {
                    //Console.Out.Write(".");
                    xxx += "1";
                    xxx.Replace("D1", "1");
                }
                if (((Keys)vkCode).ToString() == "D2")
                {
                    //Console.Out.Write(".");
                    xxx += "2";
                    xxx.Replace("D2", "2");
                }

вплоть до 9 и 0

                }
                if (((Keys)vkCode).ToString() == "Space")
                {
                    //Console.Out.Write(".");
                    xxx += " ";
                    xxx.Replace("Space", " ");
                }


            }


            string test = "2.3 4.5 6.7";   

            Regex regex = new Regex(@"\d+\.\d+");
            var ma2 = regex.Matches(xxx);
            Console.Out.Write(ma2.Count);

            xxx = String.Empty;      

            return CallNextHookEx(_hookID, nCode, wParam, lParam);
        }

Моя проблема заключается в следующем: я не могу заставить регулярное выражение работать (ma2.Count = 0) со строкой xxx (которая является вводом с клавиатуры пользователем), но когда я заменяю xxx на проверку строки, она работаетЧто я делаю не так.Не знаю, был ли я достаточно ясен.Новичок здесь.Заранее спасибо!

1 Ответ

1 голос
/ 24 сентября 2019

Обновлено:

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

Каждый раз, когда этометод вызывается, вы всегда начинаете с пустой строки.Самое большее, xxx будет иметь 1 символ.

Вам нужно будет сохранить значение xxx вне области действия функции.

Не рекомендуется (потому что вы хотите избежать static переменные для этого типа вещей), но вы можете ввести новую переменную:

private static string InputFields = "";

и использовать, например, InputFields += ".";.

Также обратите внимание, что xxx.Replace(...) на самом деле несделайте что-нибудь здесь, потому что вы не назначаете результат этого метода ни для чего.Вы можете полностью удалить его.


Согласно комментарию @ CinCout, можете ли вы проверить значение xxx?

Я пробовал приведенный выше пример, и он должен работать сtest вход:

using System;
using System.Text.RegularExpressions;

public class Program
{
    public static void Main()
    {
        var test = "2.3 4.5 6.7";
        var regex = new Regex(@"\d+\.\d+");
        var matches = regex.Matches(test);

        foreach (var match in matches)
        {
            Console.WriteLine(match);
        }
    }
}

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...