• Как реализовать трекинг установок APK файла?

    @rPman
    Где то видел, для каждого пользователя, налету, генерируете свой apk файл, с единственным отличием - изменяющимся идентификатором в файлах ресурсах. Если не нужно подписывать файл, при должном красноглазии, файл можно править прямо в apk напрямую (если отключить zip сжатие, это просто).
    Ответ написан
    2 комментария
  • Как имитировать нажатие клавиши клавиатуры?

    LoneRay
    @LoneRay Автор вопроса
    Начинающий кодировщик.
    // класс, который эмулирует нажатие клавиш в любое активное окно
        class DirectKeyPress
        {
            [DllImport("User32.dll")] // подключение системной библиотеки
            public static extern uint SendInput(uint numberOfInputs, [MarshalAs(UnmanagedType.LPArray, SizeConst = 1)] INPUT[] input, int structSize); // функция, которая отправляет запрос на идентификацию и активацию действии клавиши
            [DllImport("user32.dll")] // подключение системной библиотеки
            public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); // функция для определении окна
            [DllImport("User32.dll")] // подключение системной библиотеки
            public static extern int SetForegroundWindow(IntPtr hWnd); // функция установки фокуса для окна
            [DllImport("User32.dll")] // подключение системной библиотеки
            public static extern int ShowWindow(IntPtr hWnd, int cmdShow); // функция активации окна
    
            [StructLayout(LayoutKind.Sequential)] //Для ручного расположения полей в памяти в порядке объявления
            public struct MOUSEINPUT // структура для эмуляции мыши
            {
                int dx;
                int dy;
                uint mouseData;
                uint dwFlags;
                uint time;
                IntPtr dwExtraInfo;
            };
    
            [StructLayout(LayoutKind.Sequential)] //Для ручного расположения полей в памяти в порядке объявления
            public struct KEYBDINPUT // структура для эмуляции клавиатуры
            {
                public ushort wVk;
                public ushort wScan;
                public uint dwFlags;
                public uint time;
                public IntPtr dwExtraInfo;
            };
    
            [StructLayout(LayoutKind.Sequential)] //Для ручного расположения полей в памяти в порядке объявления
            public struct HARDWAREINPUT // структура для эмуляции подключённого внешнего устройства
            {
                uint uMsg;
                ushort wParamL;
                ushort wParamH;
            };
    
            [StructLayout(LayoutKind.Explicit)] //Для указания размера каждого поля
            public struct INPUT // структура для выбора типа устройства
            {
                [FieldOffset(0)] // задаем 0 байт для переменной type
                public int type;
                [FieldOffset(4)] // задаем 4 байта для структуры MOUSEINPUT
                public MOUSEINPUT mouse;
                [FieldOffset(4)] // задаем 4 байта для структуры KEYBDINPUT
                public KEYBDINPUT keyboard;
                [FieldOffset(4)] // задаем 4 байта для структуры HARDWAREINPUT
                public HARDWAREINPUT hardware;
            };
            const uint KEYEVENTF_KEYUP = 0x0002; // событие Up
            const uint KEYEVENTF_SCANCODE = 0x0008; // событие Down + установка типа выбора определения клавиши
    
            public void Main()
            {
                INPUT[] inputs = new INPUT[1];
    
                inputs[0].type = 1; // выбрана клавиатура
                inputs[0].keyboard.dwFlags = KEYEVENTF_SCANCODE; // Down
                inputs[0].keyboard.wScan = 42; // скэн код клавиши
                SendInput(1, inputs, Marshal.SizeOf(inputs[0])); // эмулируем нажатие
    
                inputs[0].type = 1;
                inputs[0].keyboard.dwFlags = KEYEVENTF_SCANCODE;
                inputs[0].keyboard.wScan = 30;
                SendInput(1, inputs, Marshal.SizeOf(inputs[0]));
    
                inputs[0].type = 1;
                inputs[0].keyboard.wScan = 30;
                inputs[0].keyboard.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP; // Up 
                SendInput(1, inputs, Marshal.SizeOf(inputs[0]));
    
    
                inputs[0].type = 1;
                inputs[0].keyboard.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP;
                inputs[0].keyboard.wScan = 42;
                SendInput(1, inputs, Marshal.SizeOf(inputs[0]));
            }
        }
    Ответ написан
    1 комментарий
  • Как со 100% вероятностью определить мобильный телефон?

    Sanasol
    @Sanasol Куратор тега PHP
    нельзя просто так взять и загуглить ошибку
    https://stackoverflow.com/a/28084346
    It is possible to check for navigator.plugins.length. Mobile browsers have no plugins, so navigator.plugins.length is equal to 0; Desktop browsers ordinary have plugins, so we can distinguish browsers by length of plugins array.


    Но в целом не факт что всё так просто.
    Ответ написан
    1 комментарий
  • Как реализовать отслеживание установок windows приложений?

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
    Точно так же. При скачивании приложения в дистрибутив записывается вот этот ID в любом удобном виде. При установке приложение отправляет этот ID на сервер. А на сервере бэкэнд уже обрабатывает этот ID как надо.
    Ответ написан
    4 комментария
  • Async-await и Task.wait() В чем разница?

    @carbon88
    .NET developer/ORM developer
    Task.Wait() будет блокировать вызывающий поток, а await не будет этого делать.
    Так называемый continuation (то что ниже await) будет выполнен после завершения таска, что ожидается через await. При этом вызывающий поток блокироваться не будет и сможет выполнить еще какую-то работу, например, среагировать на нажатие кнопки если это основной поток GUI приложения или если это асп.нет приложение он сможет начать обрабатывать следующий запрос.
    Как только таск выполнится начнется исполнение continuation и в некоторых случаях не гарантируется что это будет тот же поток в котором выполнялся код до await.
    Ответ написан
    Комментировать
  • Async-await и Task.wait() В чем разница?

    Прочитайте разницу между асинхнонностью (async\await) и многопоточностью (Task.wait())
    Ответ написан
    Комментировать
  • Async-await и Task.wait() В чем разница?

    yarosroman
    @yarosroman Куратор тега C#
    C# the best
    Wait это старое. async\await это лишь синтаксический сахар. При использовании async\await все исключения пробрасываются в вызывающий поток, и вы можете все обернуть в try/catch, естественно читаемость кода и тд. Вот хорошая статья https://habrahabr.ru/post/260217/ и как вариант есть книга Асинхронное программирование в C# 5.0 Алекса Дэвиса.
    Ответ написан
    1 комментарий
  • Как получить адрес видео из ВКонтакте?

    gadfi
    @gadfi
    https://gamega.org
    я вроде как не элита, но написал в сапорт и дали без проблем
    Ответ написан
    Комментировать
  • Как получить адрес видео из ВКонтакте?

    @VZVZ
    Reverse-Engineer, Software Developer, Architect
    Массив не массив, а ссылки можно извлечь с помощью HTTP-запросов, имитировав браузер с работающей в нем клиентской частью сайта (JS). Сниффер Fiddler в помощь для анализа.
    Ответ написан
    2 комментария
  • Смена URL без перезагрузки страницы?

    siegerstein
    @siegerstein
    history.pushState(null, null, '/anypath');
    Ответ написан
    Комментировать