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

Блокировка работы пользователя

24.11.2009, 14:46. Показов 4446. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Пишу программу (MS Visual Studio 2008), работа которой состоит в разделении времени пользователя на рабочее и время отдыха. Во время отдыха пользователь, не должен иметь доступ к ПК, определенное время т.е. ситуация подобна отключению мыши и клавиатуры.
Вопрос: Как заблокировать работу пользователя? В идеале было бы хорошо отключить клавиатуру и мышь, но как это сделать?
Буду благодарен за любую информацию по теме.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.11.2009, 14:46
Ответы с готовыми решениями:

Блокировка ip во время работы приложения
Здравствуйте, подскажите как можно сделать чтобы при запуске программы блокировался ip например 145.345.8.9?

Какие инструменты можно использовать для организации работы пользователя с кучей?
В универе дали следующее задание: Организовать в программе работу с пользовательской кучей. В программе должны быть реализованы...

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

12
1923 / 428 / 41
Регистрация: 12.07.2007
Сообщений: 2,062
24.11.2009, 17:28
Нужно использовать WinAPI. Установить глобальные хуки на клавиатуру и мышь.
0
2 / 2 / 0
Регистрация: 24.11.2009
Сообщений: 9
25.11.2009, 23:18  [ТС]
Green, думаю что пойдет. Пишу всеже на С#, просто подулючу библиотеки. Вот здесь: [URL] нашел то, что мне нужно.
Вопрос: Все выше описаное вписал себе в прогу (прога не консольная), как вызвать обработку хуков при включении/выключении таймера отсчета времени отдыха?
C#
1
2
_hookID = SetHook(_proc);//установить
//UnhookWindowsHookEx(_hookID)//снять
Правильно? Как заблокировать клавиатуру т.е. что писать здесь?
C#
1
2
3
4
5
6
7
8
9
10
11
12
private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
        {
            if ((nCode >= 0) && (wParam == (IntPtr)WM_KEYDOWN))
            {
                int vkCode = Marshal.ReadInt32(lParam);
                if (((Keys)vkCode == Keys.LWin) || ((Keys)vkCode == Keys.RWin))
                {
                    // Console.WriteLine("{0} blocked!", (Keys)vkCode);
                    // ?????????????????????????????????????????????????????
                    return (IntPtr)1;
                }
            }
0
1923 / 428 / 41
Регистрация: 12.07.2007
Сообщений: 2,062
26.11.2009, 02:21
Цитата Сообщение от Wist Посмотреть сообщение
как вызвать обработку хуков при включении/выключении таймера отсчета времени отдыха?
Зависит от того как реализован таймер. Если таймер работает пока происходит блокировка, то обработчике для таймера, сначала установить хук, а в самом конце снять.

Цитата Сообщение от Wist Посмотреть сообщение
Как заблокировать клавиатуру т.е. что писать здесь?
C#
1
2
3
4
            if ((nCode >= 0) && (wParam == (IntPtr)WM_KEYDOWN))
            {
                    return (IntPtr)1;
            }
1
2 / 2 / 0
Регистрация: 24.11.2009
Сообщений: 9
26.11.2009, 10:59  [ТС]
Green, спасибо.
Вопрос: Клаву я заблокировал. Остается заблокировать мышь, жду ваших предложений (хочу заблокировать, с помощью того же глобального хука, описанного мной выше, нужно только изменить константу WH_KEYBOARD_LL на WH_MOUSE_LL в SetWindowsHookEx, но как их совместить в одном хуке я не знаю)?

Добавлено через 21 минуту
Да и еще теперь после того как таймер отсчитал, положенное ему время клава не включается:

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
          /// запуск отсчета времени отдыха
      /// </summary>
      public void timerRest_Tick(object sender, System.EventArgs e)
      {
            //присвоим делегат одной из переменных-членов класса, чтоб сборщик мусора не убрал
            //его после окончания первого же вызова функции
            _proc = new LowLevelKeyboardProc(HookCallback);
            SetHook(_proc);// устанавливаем хук
            countSec++;
            
        // счетчик отдыха достиг порогового времени
        if(countSec >= timeRest)
            {
                // оповещение пользователя
                this.notifyIcon.Text = "Таймер не запущен!";
 
                // отдохнули - можно притупать к работе
                UnhookWindowsHookEx(_hookID);// снимаем хук
                countSec = 0;
                timerRest.Stop();
                strPrompt = "Работа!";
                pictureBox1.Invalidate();
                panel1.Visible = false;
 
                
                // меняем активность элементов
                menuItemStart.Enabled = true;
                menuItemStop.Enabled = false;
                //
 
                PrepareWork();
 
                
                // оповещение, что пора начать работать
                PlaySound(strPathSound, Handle, (uint)0x00020000L|0x0001);
                
                // разрешим изменять временные интервалы перед запуском программы
                menuItemSetTimes.Enabled = true;
            }
Как ее включить (вопрос про мышь остается в силе)?

Добавлено через 1 час 12 минут
Теперь после того как таймер отсчитал, положенное ему время:
1: Клава не включается.
2. Диспетчер задач не работает (заблокировал ключем в реестре).
Как вернуть работоспособность? Вот мой код:
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
....
//**********Отключение CtrlAltDelete*********************************
        public void KillCtrlAltDelete()
        {
            RegistryKey regkey;
            string keyValueInt = "1";
            string subKey = "Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System";
 
            try
            {
                regkey = Registry.CurrentUser.CreateSubKey(subKey);
                regkey.SetValue("DisableTaskMgr", keyValueInt);
                regkey.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }
        //**********************************************************
        //**********Включение CtrlAltDelete*************************
        public void LiveCtrlAltDelete()
        {
            RegistryKey regkey;
            string keyValueInt = "0";
            string subKey = "Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System";
 
            try
            {
                regkey = Registry.CurrentUser.CreateSubKey(subKey);
                regkey.SetValue("DisableTaskMgr", keyValueInt);
                regkey.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }
....        
          /// запуск отсчета времени отдыха
      /// </summary>
      public void timerRest_Tick(object sender, System.EventArgs e)
      {
            //присвоим делегат одной из переменных-членов класса, чтоб сборщик мусора не убрал
            //его после окончания первого же вызова функции
            _proc = new LowLevelKeyboardProc(HookCallback);
            KillCtrlAltDelete();//Блокируем диспетчер задач
            SetHook(_proc);// устанавливаем хук
            countSec++;
            
        // счетчик отдыха достиг порогового времени
        if(countSec >= timeRest)
            {
                // оповещение пользователя
                this.notifyIcon.Text = "Таймер не запущен!";
 
                // отдохнули - можно притупать к работе
                                LiveCtrlAltDelete();//Возобновляем работу диспетчера задач
                                UnhookWindowsHookEx(_hookID);// снимаем хук
                                countSec = 0;
                timerRest.Stop();
                strPrompt = "Работа!";
                pictureBox1.Invalidate();
                panel1.Visible = false;
 
                
                // меняем активность элементов
                menuItemStart.Enabled = true;
                menuItemStop.Enabled = false;
                //
 
                PrepareWork();
 
                
                // оповещение, что пора начать работать
                PlaySound(strPathSound, Handle, (uint)0x00020000L|0x0001);
                
                // разрешим изменять временные интервалы перед запуском программы
                menuItemSetTimes.Enabled = true;
            }
1
1923 / 428 / 41
Регистрация: 12.07.2007
Сообщений: 2,062
26.11.2009, 17:10
Цитата Сообщение от Wist Посмотреть сообщение
//присвоим делегат одной из переменных-членов класса, чтоб сборщик мусора не убрал //его после окончания первого же вызова функции
Вот из-за этого не происходит. Если timeRest>1, то начиная со второго срабатывания таймера, _proc получает нового делегата, а предидущую ссылку (из предидущего срабатывания таймера) теряет и ее убирает сборщик. Таким образом вы устанавливаете хук timeRect раз и снимаете только последний хук.
Заведите булеву переменную (например, hookDisabled). По ней будет определяться установлен хук или нет. Обернете код установки хука в if. Этот if как раз будет проверять эту переменную. Если Истина, то устанавливаем хук, и меняем эту переменную в Ложь. И в код после снятия хука опять устанавливаем ее в Истину.

Покажите весь код связанный с SetWindowsHookEx и установкой WH_KEYBOARD_LL

Добавлено через 2 секунды
Цитата Сообщение от Wist Посмотреть сообщение
//присвоим делегат одной из переменных-членов класса, чтоб сборщик мусора не убрал //его после окончания первого же вызова функции
Вот из-за этого не происходит. Если timeRest>1, то начиная со второго срабатывания таймера, _proc получает нового делегата, а предидущую ссылку (из предидущего срабатывания таймера) теряет и ее убирает сборщик. Таким образом вы устанавливаете хук timeRect раз и снимаете только последний хук.
Заведите булеву переменную (например, hookDisabled). По ней будет определяться установлен хук или нет. Обернете код установки хука в if. Этот if как раз будет проверять эту переменную. Если Истина, то устанавливаем хук, и меняем эту переменную в Ложь. И в код после снятия хука опять устанавливаем ее в Истину.

Покажите весь код связанный с SetWindowsHookEx и установкой WH_KEYBOARD_LL
0
2 / 2 / 0
Регистрация: 24.11.2009
Сообщений: 9
26.11.2009, 17:44  [ТС]
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
using System.Runtime.InteropServices;
 
namespace hook
{
    class Program
    {
        private const int WH_KEYBOARD_LL = 13;
        private const int WM_KEYDOWN = 0x0100;
        private static LowLevelKeyboardProc _proc = HookCallback;
        private static IntPtr _hookID = IntPtr.Zero;
 
        static void Main()
        {
            Application.Run();
        }
 
        private static IntPtr SetHook(LowLevelKeyboardProc proc)
        {
            using (Process curProcess = Process.GetCurrentProcess())
            using (ProcessModule curModule = curProcess.MainModule)
            {
                return SetWindowsHookEx(WH_KEYBOARD_LL, proc, GetModuleHandle(curModule.ModuleName), 0);
            }
        }
 
        private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);
 
        private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
        {
            if ((nCode >= 0) && (wParam == (IntPtr)WM_KEYDOWN))
            {
                int vkCode = Marshal.ReadInt32(lParam);
                if (((Keys)vkCode == Keys.LWin) || ((Keys)vkCode == Keys.RWin))
                {
                    return (IntPtr)1;
                }
            }
            return CallNextHookEx(_hookID, nCode, wParam, lParam);
        }
 
        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);
 
        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern bool UnhookWindowsHookEx(IntPtr hhk);
 
        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);
 
        [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern IntPtr GetModuleHandle(string lpModuleName);  
    }
}
0
1923 / 428 / 41
Регистрация: 12.07.2007
Сообщений: 2,062
26.11.2009, 18:03
C#
1
2
3
4
5
6
7
8
9
        private const int WH_MOUSE_LL 14;
        private static IntPtr SetMouseHook(LowLevelKeyboardProc proc)
        {
            using (Process curProcess = Process.GetCurrentProcess())
            using (ProcessModule curModule = curProcess.MainModule)
            {
                return SetWindowsHookEx(WH_MOUSE_LL, proc, GetModuleHandle(curModule.ModuleName), 0);
            }
        }
Делегат можно использовать тот же, прототипы у них одинаковые. Работает с сообщениями WM_LBUTTONDOWN, WM_LBUTTONUP, WM_MOUSEMOVE, WM_MOUSEWHEEL, WM_RBUTTONDOWN или WM_RBUTTONUP
1
2 / 2 / 0
Регистрация: 24.11.2009
Сообщений: 9
26.11.2009, 19:33  [ТС]
Клава отказывается работать. Вот код:
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
40
41
42
43
44
45
46
47
48
49
50
51
public void timerRest_Tick(object sender, System.EventArgs e)
        {
            //присвоим делегат одной из переменных-членов класса, чтоб сборщик мусора не убрал
            // его после окончания первого же вызова функции
            _proc = new LowLevelKeyboardProc(HookCallback);
            bool hookDisabled = true;
            // Включение режима
            KillCtrlAltDelete();//Блокируем диспетчер задач
            if (hookDisabled == true)
                {
                    SetHook(_proc); // устанавливаем хук
                    hookDisabled = false;
                }
            countSec++;
            
            // счетчик отдыха достиг порогового времени
            if(countSec >= timeRest)
            {
                // оповещение пользователя
                this.notifyIcon.Text = "Таймер не запущен!";
 
                // отдохнули - можно притупать к работе
                // Выключение режима
                LiveCtrlAltDelete();//Возобновляем работу диспетчера задач
                bool b = UnhookWindowsHookEx(_hookID);//снимаем хук
                if (b == false) 
                {
                    strPrompt = "Ошибка";
                } 
                hookDisabled = true;
                countSec = 0;
                timerRest.Stop();
                strPrompt = "Работа!";
                pictureBox1.Invalidate();
                panel1.Visible = false;
 
                
                // меняем активность элементов
                menuItemStart.Enabled = true;
                menuItemStop.Enabled = false;
                //
 
                PrepareWork();
 
                
                // оповещение, что пора начать работать
                PlaySound(strPathSound, Handle, (uint)0x00020000L|0x0001);
                
                // разрешим изменять временные интервалы перед запуском программы
                menuItemSetTimes.Enabled = true;
            }
По идее должно написать "Ошибка", но пишет "Работа!" даже не знаю, в чем проблема.
0
2 / 2 / 0
Регистрация: 24.11.2009
Сообщений: 9
27.11.2009, 07:56  [ТС]
Ошибка с клавиатурой решена. Буду делать мышь.
0
2 / 2 / 0
Регистрация: 24.11.2009
Сообщений: 9
28.11.2009, 18:19  [ТС]
Начал делать хук для мыши и столкнулся вот с чем.
C#
1
2
3
//Функция установки хука для клавиатруы
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);
Для мыши параметр LowLevelKeyboardProc должен быть такой LowLevelMouseProc. Создаю еще один вызов ф-и API:
C#
1
2
3
//Функция установки хука для мыши
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr SetWindowsHookEx(int idHook, LowLevelMouseProc lpfn, IntPtr hMod, uint dwThreadId);
сразу насторожило, то что слово LowLevelMouseProc не подсвечивается голубым цветом в отличии от LowLevelKeyboardProc.
Выдает ошибку вида: "error CS0246: The type or namespace name 'LowLevelMouseProc' could not be found (are you missing a using directive or an assembly reference?)"
Здесь
C#
1
2
private static LowLevelKeyboardProc _proc = HookCallback;
private static LowLevelMouseProc _proc = HookCallback;
та же самая ситуация и та же самая ошибка. Где туплю?
0
2 / 2 / 0
Регистрация: 24.11.2009
Сообщений: 9
29.11.2009, 10:52  [ТС]
Разобрался. Начал делать хук для мыши по этому образцу:
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
class InterceptMouse
{
    private static LowLevelMouseProc _proc = HookCallback;
    private static IntPtr _hookID = IntPtr.Zero;
 
    public static void Main()
    {
        _hookID = SetHook(_proc);
        Application.Run();
        UnhookWindowsHookEx(_hookID);
    }
 
    private static IntPtr SetHook(LowLevelMouseProc proc)
    {
        using (Process curProcess = Process.GetCurrentProcess())
        using (ProcessModule curModule = curProcess.MainModule)
        {
            return SetWindowsHookEx(WH_MOUSE_LL, proc,
                GetModuleHandle(curModule.ModuleName), 0);
        }
    }
 
    private delegate IntPtr LowLevelMouseProc(int nCode, IntPtr wParam, IntPtr lParam);
 
    private static IntPtr HookCallback(
        int nCode, IntPtr wParam, IntPtr lParam)
    {
        if (nCode >= 0 &&
            MouseMessages.WM_LBUTTONDOWN == (MouseMessages)wParam)
        {
            MSLLHOOKSTRUCT hookStruct = (MSLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(MSLLHOOKSTRUCT));
            Console.WriteLine(hookStruct.pt.x + ", " + hookStruct.pt.y);
        }
        return CallNextHookEx(_hookID, nCode, wParam, lParam);
    }
 
    private const int WH_MOUSE_LL = 14;
 
    private enum MouseMessages
    {
        WM_LBUTTONDOWN = 0x0201,
        WM_LBUTTONUP = 0x0202,
        WM_MOUSEMOVE = 0x0200,
        WM_MOUSEWHEEL = 0x020A,
        WM_RBUTTONDOWN = 0x0204,
        WM_RBUTTONUP = 0x0205
    }
 
    [StructLayout(LayoutKind.Sequential)]
    private struct POINT
    {
        public int x;
        public int y;
    }
 
    [StructLayout(LayoutKind.Sequential)]
    private struct MSLLHOOKSTRUCT
    {
        public POINT pt;
        public uint mouseData;
        public uint flags;
        public uint time;
        public IntPtr dwExtraInfo;
    }
 
    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern IntPtr SetWindowsHookEx(int idHook,
        LowLevelMouseProc lpfn, IntPtr hMod, uint dwThreadId);
 
    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool UnhookWindowsHookEx(IntPtr hhk);
 
    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode,
        IntPtr wParam, IntPtr lParam);
 
    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern IntPtr GetModuleHandle(string lpModuleName);
}
Что писать здесь, чтобы наглухо заблокировать мышь?
C#
1
2
3
4
5
6
7
8
9
10
11
private static IntPtr HookCallback(
        int nCode, IntPtr wParam, IntPtr lParam)
    {
        if (nCode >= 0 &&
            MouseMessages.WM_LBUTTONDOWN == (MouseMessages)wParam)
        {
            MSLLHOOKSTRUCT hookStruct = (MSLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(MSLLHOOKSTRUCT));
            Console.WriteLine(hookStruct.pt.x + ", " + hookStruct.pt.y);
        }
        return CallNextHookEx(_hookID, nCode, wParam, lParam);
    }
0
2 / 2 / 0
Регистрация: 24.11.2009
Сообщений: 9
29.11.2009, 21:57  [ТС]
Правильный ответ:
C#
1
return (IntPtr)1;
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.11.2009, 21:57
Помогаю со студенческими работами здесь

Для каждого пользователя динамически создавать форму, не нарушая синхронности работы с БД
Добрый вечер. Такой вот вопрос: На странице а.aspx есть линкбатон, после его нажатия пользователь редиректится на страницу b.aspx , на...

Блокировка пользователя после нескольких неудачных попыток входа при использовании membership service
Уважаемые Гуру! В silverlight приложении используется стандартная авторизация из silverlight business application. После нескольких...

API для работы с аккаунтом пользователя. VkNET
Добрый вечер. Как для метода Account.LookupContacts указать параметры? var search = vk.Account.LookupContacts(new...

Блокировка пользователя
Есть 2 класса, админ и пользователь. И метод у админа, который должен забанить пользователя, изменить его булевое свойство banned на true....

Изменение роли пользователя в момент его работы
Здравствуйте. Всех с НГ) Хотел бы услышать совет не столько по коду, сколько в логическом разрешении проблемы. есть сервер:...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru