Форум программистов, компьютерный форум, киберфорум
C/C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
5 / 5 / 3
Регистрация: 30.06.2012
Сообщений: 424

Получение скрытого метода с помощью QueryInterface

12.09.2025, 09:57. Показов 3098. Ответов 6

Студворк — интернет-сервис помощи студентам
Приветствую!
Кратко: Я пытаюсь написать программу, которая по определенному событию будет отключать мне джойстик (Xbox Series Controller), подключенный к компьютеру с помощью беспроводного адаптера от Xbox. Вот пост на стеке.
Вот проект, в который я хочу встроить эту функцию. Это приложение, которое при старте Big Picture в стим автоматически меняет звуковое устройство на выбранное, а при выходе из игры меняет его обратно и отключает джойстик.

Подробно:
В 2024 году Майкрософт открыли документацию по GIP протоколу, по которому работает джойстик Xbox Series в том числе.
Я очень долго ковырял документацию и пробовал разные подходы в коде, чтобы добиться желаемого, но к сожалению, безуспешно. Я пробовал отправлять пакеты данных с помощью libusbdotnet, пробовал получать хендл устройства и писать данные в него, пробовал имеющийся Gaming.Input апи, но он не позволяет управлять питанием джойстика.

Что, в теории, нужно сделать: на джойстик отправляется определенный пакет, в котором содержится информация о типе команды и пейлод с содержанием команды.
Вот пример:
C#
1
2
3
4
5
 powerOffCommand[0] = 0x05; // Command ID
   powerOffCommand[1] = 0x20; // Flags
   powerOffCommand[2] = 0x01; // Sequence number - плохо понял че это и как с этим работать
   powerOffCommand[3] = 0x01; // payload length
   powerOffCommand[4] = 0x04; // payload. Power Off command.
Пакет выше описывает команду выключения. Я это взял из документации по гип.

В итоге я написал в поддержку майков по гип документации и вот варианты, которые они мне предложили:
- Use the D4XDevice SDK, This requires Non Disclosure Agreement between Microsoft and your Corporation.
- Reverse engineer the ioctl (but we aware it may break in the future because its not a public API). You will be calling DeviceIOControl API with the IOCTL code that results in device power-off.
- Reverse engineer the COM PowerOff API (but we aware it may break in the future because its not a public API). Here you would be figuring out the COM Class GUID value.
- Uninstalling the Microsoft implementation of the protocol in the “xboxgip.sys” driver and replacing it with your own usb driver that implements the protocol in device manager.
Я выделил жирным вариант, который хотел бы попробовать, так как в переписке мне сказали, что такой метод есть, но он не доступен в открытую и его надо получать через Query Interface. И вот в этом заключается вопрос:

Как с помощью QueryInterface можно получить это метод? Это уже выше моих знаний про C#. Я не готов писать целый драйвер, я просто хочу отключать джойстик, когда закрывается игра.

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

Кликните здесь для просмотра всего текста
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
using System.ComponentModel;
using System.Runtime.InteropServices;
using Microsoft.Win32.SafeHandles;
 
public class XboxGipController
{
    // Constants
    private const uint GENERIC_READ = 0x80000000;
    private const uint GENERIC_WRITE = 0x40000000;
    private const uint FILE_SHARE_READ = 0x00000001;
    private const uint FILE_SHARE_WRITE = 0x00000002;
    private const uint OPEN_EXISTING = 3;
    private const uint FILE_ATTRIBUTE_NORMAL = 0x00000080;
 
    // Define the specific IOCTL code
    private const uint GIP_ADD_REENUMERATE_CALLER_CONTEXT = 0x40001CD0;
 
    [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
    private static extern SafeFileHandle CreateFileW(
        string lpFileName,
        uint dwDesiredAccess,
        uint dwShareMode,
        IntPtr lpSecurityAttributes,
        uint dwCreationDisposition,
        uint dwFlagsAndAttributes,
        IntPtr hTemplateFile
    );
 
    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern bool DeviceIoControl(
        SafeFileHandle hDevice,
        uint dwIoControlCode,
        IntPtr lpInBuffer,
        uint nInBufferSize,
        IntPtr lpOutBuffer,
        uint nOutBufferSize,
        out uint lpBytesReturned,
        IntPtr lpOverlapped
    );
 
    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern bool ReadFile(
        SafeFileHandle hFile,
        byte[] lpBuffer,
        uint nNumberOfBytesToRead,
        out uint lpNumberOfBytesRead,
        IntPtr lpOverlapped
    );
 
    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern bool WriteFile(
        SafeFileHandle hFile,
        byte[] lpBuffer,
        uint nNumberOfBytesToWrite,
        out uint lpNumberOfBytesWritten,
        IntPtr lpOverlapped
    );
 
    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern bool CloseHandle(IntPtr hObject);
 
    private static void ProcessGipMessage(byte[] data, int length)
    {
        Console.WriteLine($"Received {length} bytes:");
        for (int i = 0; i < length; i++)
        {
            Console.Write($"{data[i]:X2} ");
            if ((i + 1) % 16 == 0)
                Console.WriteLine();
        }
        Console.WriteLine();
    }
 
    public static void ReenumerateGipControllers()
    {
        SafeFileHandle? hFile = null;
 
        try
        {
            // Open the GIP device interface
            hFile = CreateFileW(
                @"\\.\XboxGIP",
                GENERIC_READ | GENERIC_WRITE,
                FILE_SHARE_READ | FILE_SHARE_WRITE,
                IntPtr.Zero,
                OPEN_EXISTING,
                FILE_ATTRIBUTE_NORMAL,
                IntPtr.Zero
            );
 
            if (hFile.IsInvalid)
            {
                throw new System.ComponentModel.Win32Exception(Marshal.GetLastWin32Error());
            }
 
            // Send the re-enumeration command
            uint bytesReturned;
            bool success = DeviceIoControl(
                hFile,
                GIP_ADD_REENUMERATE_CALLER_CONTEXT,
                IntPtr.Zero,
                0,
                IntPtr.Zero,
                0,
                out bytesReturned,
                IntPtr.Zero
            );
 
            if (!success)
                throw new System.ComponentModel.Win32Exception(Marshal.GetLastWin32Error());
 
            Console.WriteLine("GIP controller re-enumeration triggered successfully");
 
            byte[] powerOffCommand = new byte[64];
            // Xbox controller ID
            powerOffCommand[0] = 0x7E;
            powerOffCommand[1] = 0xED;
            powerOffCommand[2] = 0x82;
            powerOffCommand[3] = 0xC6;
            powerOffCommand[4] = 0x8B;
            powerOffCommand[5] = 0xDA;
            powerOffCommand[6] = 0x00;
            powerOffCommand[7] = 0x00;
 
            powerOffCommand[8] = 0x05; // Command ID
            powerOffCommand[9] = 0x20; // Flags
            powerOffCommand[10] = 0x01; // Sequence number
            powerOffCommand[11] = 0x01; // payload length
            powerOffCommand[12] = 0x04; // payload
 
            // Send the power off command
            // Comment the next 15 lines to skip writing and check how ReadFile works.
            // Otherwise the code will throw.
            uint bytesWritten;
            bool successWrite = WriteFile(
                hFile,
                powerOffCommand,
                (uint)powerOffCommand.Length,
                out bytesWritten,
                IntPtr.Zero
            );
 
            if (!successWrite)
            {
                ProcessGipMessage(powerOffCommand, powerOffCommand.Length);
                throw new Win32Exception(Marshal.GetLastWin32Error());
            }
 
            byte[] buffer = new byte[1000];
            uint bytesRead;
            while (true)
            {
                bool successRead = ReadFile(
                    hFile, // Handle to the GIP device
                    buffer, // Buffer to receive data
                    (uint)buffer.Length, // Buffer size
                    out bytesRead, // Number of bytes actually read
                    IntPtr.Zero
                );
 
                if (!successRead)
                {
                    int error = Marshal.GetLastWin32Error();
                    if (error == 259)
                        break;
 
                    throw new Win32Exception(error);
                }
 
                if (bytesRead > 0)
                {
                    ProcessGipMessage(buffer, (int)bytesRead);
                }
                else
                {
                    System.Threading.Thread.Sleep(10);
                }
            }
        }
        finally
        {
            hFile?.Close();
        }
    }
 
    // Usage example
    public static void Main()
    {
        try
        {
            ReenumerateGipControllers();
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error: {ex.Message}");
        }
    }
}


PS. Предубеждая некоторые комментарии:
  1. В стиме есть функция выключения джойстика при выходе из игры, но она не работает с джойстиком искбокс
  2. Я могу выключать джойстик, зажав центральную кнопку на 5-6 секунд, но я хочу добиться такого опыта, где ничего делать не надо
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.09.2025, 09:57
Ответы с готовыми решениями:

Вызов QueryInterface завершится с сбоем
Всем привет создал ComboBox добавил элементы в коллекцию через палитру свойств и один...

Авторизация на сайте с помощью скрытого Webrowser
Ребят, подскажите пожалуйста. Пример, При запуске программы webrowser переходит на сайт где...

Полиморфизм: вызов метода базового класса, переопределенного метода и нового метода
В базовом классе метод помечен как virtual. Насколько я понял из книги: override означает, что...

6
 Аватар для andrey_f
884 / 537 / 228
Регистрация: 21.02.2011
Сообщений: 5,705
12.09.2025, 16:59
Цитата Сообщение от magrega Посмотреть сообщение
0x40001CD0
Уверены?

Из всех возможных решений - вы выбрали самое сложное.
0
5 / 5 / 3
Регистрация: 30.06.2012
Сообщений: 424
12.09.2025, 17:06  [ТС]
Я ни в чем не уверен, но 0x40001CD0 я взял из репо человека, который занимается ковыряем джойстиков, взял из его статьи.

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

Я в целом уже свыкся с мыслью, что весь код, приведенный мной, не может работать в принципе из-за проприетарного протокола майкрософтов. Потому я написал здесь в надежде, что мне помогут расковырять метод отключения с помощью QueryInterface
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3412 / 2733 / 575
Регистрация: 04.09.2018
Сообщений: 8,580
Записей в блоге: 3
13.09.2025, 09:58
magrega, ни у кого нет джойстика XBox..
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16137 / 11261 / 2888
Регистрация: 21.04.2018
Сообщений: 33,101
Записей в блоге: 2
14.09.2025, 13:03
Цитата Сообщение от magrega Посмотреть сообщение
метод отключения с помощью QueryInterface
Вы не туда обратились за помощью.
Вам нужны специалисты по работе с COM, но на C# (да, и в .Net в целом) он используется крайне редко.
Думаю вам лучше обратиться в раздел Плюсов.
Если там смогут найти решение, то портировать его на C# уже не будет большой проблемой.

Перенести вашу тему в Плюсы?
1
5 / 5 / 3
Регистрация: 30.06.2012
Сообщений: 424
14.09.2025, 19:27  [ТС]
Элд Хасп, если Вы считаете, что так будет лучше, то конечно. С# я занимаюсь в качестве хобби, потому могу не знать чего-то. Давайте перенесем. Спасибо.
0
5 / 5 / 3
Регистрация: 30.06.2012
Сообщений: 424
23.11.2025, 20:07  [ТС]
Пока что я пытаюсь хоть каким-нибудь способ добиться записи команды в геймпад, чтобы его отключить. На данный момент не удалось совершить удачной записи, но есть несколько новых наблюдений, которые могут подсказать, что делать дальше.

С помощью WriteFile в С# отправил на джойстик такой пакет: 0x7E 0xED 0x82 0xC6 0x8B 0xDA 0x00 0x00 0x05 0x20 0x01 0x01 0x04, где первые 8 байт - айди джойстика, другие 5 - команда выключения. К команде я добавил паддинг нулей, чтобы пакет был 64 байта.

Интересно то, что я получаю ошибки 87 Invalid parameter, что говорит мне о том, что я стучусь в верное устройство, но сама команда построена неверно. Доказательством этого служит тот факт, что при попытке изменить буквы или цифры первых 8 байтов (айди), получается ошибка 1167 Device Not Connected.

Так же, если пытаться отправить команду меньше, чем 29 байт (вроде бы, уже не помню), то вылетает ошибка 122 Wrong length. Пакет в 64 байта выбран не случайно, такой объем указан в документации к GIP протоколу.

Так же я пробовал отправлять команды с помощью hidapitester. Успешно открыл девайс с помощью HID-пути
'\\?\HID#VID_045E&PID_0B12&IG_00#a&14e16 0f7&7&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}

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

Так же удалось познакомиться с челом со стека, который пилит свой софт под джойстики для хбокс. Он как раз пользуется этой прогой D4XDevice. Из-за NDA он не смог со мной поделиться полезными деталями, но скинул мне дамп wireshark, где он с помощью этой программы отключает джойстик. Как раз в дампе из вайршарк есть пакеты отключения. Интересно, что буквально в рамках секунд эта прога спамит большое количество команд на выключение. Пример первого и последнего пакета:

1131 2025-11-14 06:28:50,098304 host 1.50.4 USB 99 URB_BULK out
0000 1b 00 10 b0 fc 41 89 ab ff ff 00 00 00 00 09 00
0010 00 01 00 32 00 04 03 48 00 00 00 40 00 00 50 00
0020 00 00 00 00 00 00 00 a0 00 00 20 01 00 1f 00 00
0030 00 00 00 00 00 00 00 00 00 00 00 88 42 90 00 7e
0040 ed 8d 64 b0 ef 62 45 b5 04 6a e0 62 45 b5 04 6a
0050 e0 00 00 00 00 00 00 05 20 00 01 04 ab ff ff 00
0060 00 00 00

1395 2025-11-14 06:28:51,720058 host 1.50.4 USB 99 URB_BULK out
0000 1b 00 10 b0 fc 41 89 ab ff ff 00 00 00 00 09 00
0010 00 01 00 32 00 04 03 48 00 00 00 40 00 00 50 00
0020 00 00 00 00 00 00 00 a0 00 00 20 01 00 1f 00 00
0030 00 00 00 00 00 00 00 00 00 00 00 88 42 90 00 7e
0040 ed 8d 64 b0 ef 62 45 b5 04 6a e0 62 45 b5 04 6a
0050 e0 00 00 00 00 00 00 05 20 6b 01 04 ab ff ff 00
0060 00 00 00

Кликните здесь для просмотра всего текста
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
using System.ComponentModel;
using System.Runtime.InteropServices;
using Microsoft.Win32.SafeHandles;
 
public class XboxGipController 
{
    // Constants
    private const uint GENERIC_READ = 0x80000000;
    private const uint GENERIC_WRITE = 0x40000000;
    private const uint FILE_SHARE_READ = 0x00000001;
    private const uint FILE_SHARE_WRITE = 0x00000002;
    private const uint OPEN_EXISTING = 3;
    private const uint FILE_ATTRIBUTE_NORMAL = 0x00000080;
 
    // Define the specific IOCTL code
    private const uint GIP_ADD_REENUMERATE_CALLER_CONTEXT = 0x40001CD0;
 
    [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
    public static extern SafeFileHandle CreateFileW(
              string lpFileName,
              uint dwDesiredAccess,
              uint dwShareMode,
              IntPtr lpSecurityAttributes,
              uint dwCreationDisposition,
              uint dwFlagsAndAttributes,
              IntPtr hTemplateFile
          );
 
    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern bool DeviceIoControl(
        SafeFileHandle hDevice,
        uint dwIoControlCode,
        IntPtr lpInBuffer,
        uint nInBufferSize,
        IntPtr lpOutBuffer,
        uint nOutBufferSize,
        out uint lpBytesReturned,
        IntPtr lpOverlapped
    );
 
    [DllImport("kernel32.dll", SetLastError = true)]
    static extern bool ReadFile(
             SafeFileHandle hFile,
             byte[] lpBuffer,
             uint nNumberOfBytesToRead,
             out uint lpNumberOfBytesRead,
             IntPtr lpOverlapped
         );
 
    [DllImport("kernel32.dll", SetLastError = true)]
  
    static extern bool WriteFile(
            SafeFileHandle hFile,
            byte[] lpBuffer,
            uint nNumberOfBytesToWrite,
            out uint lpNumberOfBytesWritten,
            IntPtr lpOverlapped
        );
 
    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern bool CloseHandle(IntPtr hObject);
 
    private static void ProcessGipMessage(byte[] data, int length)
    {
        Console.WriteLine($"Received {length} bytes:");
        for (int i = 0; i < length; i++)
        {
            Console.Write($"{data[i]:X2} ");
            if ((i + 1) % 16 == 0)
                Console.WriteLine();
        }
        Console.WriteLine();
    }
 
    public static SafeFileHandle OpenXboxGipDevice()
    {
        string devicePath = @"\\.\HID#VID_045E&PID_0B12&IG_00#a&14e160f7&7&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}";
        SafeFileHandle hFile = CreateFileW(
            devicePath,
            GENERIC_READ | GENERIC_WRITE,
            FILE_SHARE_READ | FILE_SHARE_WRITE,
            IntPtr.Zero,
            OPEN_EXISTING,
            FILE_ATTRIBUTE_NORMAL,
            IntPtr.Zero
        );
 
        if (hFile.IsInvalid)
        {
            int error = Marshal.GetLastWin32Error();
            throw new System.ComponentModel.Win32Exception(error, "Failed to open GIP device");
        }
 
        return hFile;
    }
 
 
 
    public static void ReenumerateGipControllers()
    {
        SafeFileHandle? hFile = null;
 
        try
        {
            // Open the GIP device interface
            hFile = CreateFileW(
               @"\\.\XboxGIP",
                GENERIC_READ | GENERIC_WRITE,
                FILE_SHARE_READ | FILE_SHARE_WRITE,
                IntPtr.Zero,
                OPEN_EXISTING,
                FILE_ATTRIBUTE_NORMAL,
                IntPtr.Zero
            );
 
            if (hFile.IsInvalid)
            {
                throw new System.ComponentModel.Win32Exception(Marshal.GetLastWin32Error());
            }
 
            using (var handle = OpenXboxGipDevice())
            {
 
 
                // Send the re-enumeration command
                uint bytesReturned;
                bool success = DeviceIoControl(
                    hFile,
                    GIP_ADD_REENUMERATE_CALLER_CONTEXT,
                    IntPtr.Zero,
                    0,
                    IntPtr.Zero,
                    0,
                    out bytesReturned,
                    IntPtr.Zero
                );
 
                if (!success)
                    throw new System.ComponentModel.Win32Exception(Marshal.GetLastWin32Error());
 
                Console.WriteLine("GIP controller re-enumeration triggered successfully");
 
                byte[] powerOffCommand = new byte[64];
                // Xbox controller ID
                powerOffCommand[0] = 0x7e;
                powerOffCommand[1] = 0xed;
                powerOffCommand[2] = 0x82;
                powerOffCommand[3] = 0xc6;
                powerOffCommand[4] = 0x8b;
                powerOffCommand[5] = 0xda;
                powerOffCommand[6] = 0x00;
                powerOffCommand[7] = 0x00;
 
                powerOffCommand[8] = 0x05; // Command ID
                powerOffCommand[9] = 0x20; // Flags
                powerOffCommand[10] = 0x01; // Sequence number
                powerOffCommand[11] = 0x01; // payload length
                powerOffCommand[12] = 0x04; // 
 
                //Send the power off command
                uint bytesWritten;
                bool successWrite = WriteFile(
                    hFile,
                    powerOffCommand,
                    (uint)powerOffCommand.Length,
                    out bytesWritten,
                    IntPtr.Zero
                );
 
                if (!successWrite)
                {
                    ProcessGipMessage(powerOffCommand, powerOffCommand.Length);
                    throw new Win32Exception(Marshal.GetLastWin32Error());
                }
 
                byte[] buffer = new byte[1000];
                uint bytesRead;
                while (true)
                {
                    bool successRead = ReadFile(
                        hFile, // Handle to the GIP device
                        buffer, // Buffer to receive data
                        (uint)buffer.Length, // Buffer size
                        out bytesRead, // Number of bytes actually read
                        IntPtr.Zero
                    );
 
                    if (!successRead)
                    {
                        int error = Marshal.GetLastWin32Error();
                        if (error == 259)
                            break;
 
                        throw new Win32Exception(error);
                    }
 
                    if (bytesRead > 0)
                    {
                        ProcessGipMessage(buffer, (int)bytesRead);
                    }
                    else
                    {
                        System.Threading.Thread.Sleep(10);
                    }
                }
            }
        }
        finally
        {
            hFile?.Close();
        }
    }
    // Usage example
    public static void Main()
    {
            ReenumerateGipControllers();
        //try
        //{
        //}
        //catch (Exception ex)
        //{
        //    Console.WriteLine($"Error: {ex.Message}");
        //}
    }
}
Вложения
Тип файла: zip wireshark.zip (26.6 Кб, 0 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.11.2025, 20:07
Помогаю со студенческими работами здесь

Создание скрытого файла
а если точнее, то не могу нагуглить инфу о том как изменить атрибуты существующего файла через C#...

Создание скрытого файла
Уважаемые программисты, скажите, можно ли создать скрытый текстовый файл?

Реализация скрытого режима работы приложения
Скажите а как мне можно сделать так, чтобы программа работала скрыто? то есть я запустил программу...

Вывод ValidationMessage для скрытого поля
Всем привет. Не могу разобраться с сабжем) Вот есть у меня в модели такое свойство: public...

Получить значение из скрытого textBox-a
Добрый вечер В VisualStudio, в проекте Windows Forms создаю textBox в котором находится id строки...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru