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

Протолкнуть сообщение в защищенное окно

08.09.2015, 16:56. Показов 2014. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрых времени суток. Есть игра, ранее в нее можно было отправлять сообщения по средствам Send/Post меседжей и т.д. Сейчас же с игрушкой сделали непотребство, и Spy говорит что от моей программы сообщений нет. Есть ли способ насильно протолкнуть сообщения в процесс игрушки или каким-то хитрым способом сделать перенаправления событий сначала ОС, а от ОС в игру?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.09.2015, 16:56
Ответы с готовыми решениями:

Протолкнуть бит в регистр.
Здравствуйте. Появилась необходимость протолкнуть бит с ноги D2 в регистр. Т.е. если грубо говоря, то когда произошло прерывание по...

Как "протолкнуть" сайт?
Как Вы думаете, как протолкнуть этот сайт: interrogation.jino-net.ru ? Ведь поисковики не будут индексировать ничего кроме первой страницы,...

Сообщение об ошибке "Защищенное соединение VPN прекращено локально клиентом" при вводе пароля
Может я не туда и пишу, но пожалуйста помогите мне пожалуйста. Я установила удаленку рабочую и при вводе пароль он мне выдает...

20
TheGreatCornholio
 Аватар для Woldemar89
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
09.09.2015, 14:05
https://msdn.microsoft.com/ru-... s.85).aspx

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

https://msdn.microsoft.com/ru-... s.85).aspx
Для игр на DirectX можно использовать DirectInput.

http://inputsimulator.codeplex.com/
Можно попробовать библиотеки поюзать разные.

http://stackoverflow.com/quest... pplication
Или SendKeys.Send.
0
25 / 25 / 10
Регистрация: 27.11.2011
Сообщений: 272
09.09.2015, 14:58  [ТС]
Woldemar89, Я перепробовал все кроме DirectInput, инфу что по нем есть я прочел, для отправки сообщений я так понял нужно использовать SendHardwareCommand, но что такое есть int command и byte[] data, как их правильно описать?
0
 Аватар для Nalik
176 / 124 / 49
Регистрация: 30.11.2012
Сообщений: 1,330
09.09.2015, 15:10
Посмотри Spy++ в каком формате приходят запросы в игру и какие запросы посылаешь ты?
Так же попробуй запустить программу от имени администратора, возможно после изменений в игре ей не хватает прав.
1
TheGreatCornholio
 Аватар для Woldemar89
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
09.09.2015, 15:18
Если честно, не писал под DirectInput. Поищи туториалы. Или типа того.
http://habrahabr.ru/post/214955/
Цитата Сообщение от llFreeManll Посмотреть сообщение
я так понял нужно использовать SendHardwareCommand
Возможно, но я не уверен.
0
25 / 25 / 10
Регистрация: 27.11.2011
Сообщений: 272
09.09.2015, 15:28  [ТС]
Nalik, в Spy видно что игра принимает обычные SendMessage, но если я отправлю его программно, то он не проходит. А игру я от админа и запускаю.

Добавлено через 4 минуты
Woldemar89, пост с хабры тоже видел, там используется не DirectInput, а event'ы.
0
 Аватар для Nalik
176 / 124 / 49
Регистрация: 30.11.2012
Сообщений: 1,330
09.09.2015, 15:35
Цитата Сообщение от llFreeManll Посмотреть сообщение
игра принимает обычные SendMessage
Имею ввиду какого вида сообщения приходит в игру. Можно же посылать вида:
C#
1
2
PostMessage(hwnd, WM_LBUTTONDOWN, IntPtr.Zero, new IntPtr(y * 0x10000 + x));
            PostMessage(hwnd, WM_LBUTTONUP, IntPtr.Zero, new IntPtr(y * 0x10000 + x));
и к примеру:
C#
1
2
3
4
5
6
7
PostMessage(hwnd, WM_SETCURSOR, IntPtr.Zero, new IntPtr(y * 0x10000 + x));
            PostMessage(hwnd, WM_MOUSEMOVE, IntPtr.Zero, new IntPtr(y * 0x10000 + x));
            PostMessage(hwnd, WM_MOUSEHOVER, IntPtr.Zero, new IntPtr(y * 0x10000 + x));
            PostMessage(hwnd, WM_MOUSEACTIVATE, IntPtr.Zero, new IntPtr(y * 0x10000 + x));
            PostMessage(hwnd, WM_LBUTTONUP, IntPtr.Zero, new IntPtr(y * 0x10000 + x));
            PostMessage(hwnd, WM_LBUTTONDOWN, IntPtr.Zero, new IntPtr(y * 0x10000 + x));
            PostMessage(hwnd, WM_LBUTTONUP, IntPtr.Zero, new IntPtr(y * 0x10000 + x));
В первом случае может не работать, во втором будет работать.

Цитата Сообщение от llFreeManll Посмотреть сообщение
А игру я от админа и запускаю.
А запускать нужно вашу программу от админа)

Над какой игрой эксперименты проводите?)
0
25 / 25 / 10
Регистрация: 27.11.2011
Сообщений: 272
09.09.2015, 15:55  [ТС]
Nalik, а для клавиатуры разница между первым и вторым примером тоже будет действовать? Я так понял все из- за этих строк:
C#
1
2
3
4
PostMessage(hwnd, WM_SETCURSOR, IntPtr.Zero, new IntPtr(y * 0x10000 + x));
PostMessage(hwnd, WM_MOUSEMOVE, IntPtr.Zero, new IntPtr(y * 0x10000 + x));
PostMessage(hwnd, WM_MOUSEHOVER, IntPtr.Zero, new IntPtr(y * 0x10000 + x));
PostMessage(hwnd, WM_MOUSEACTIVATE, IntPtr.Zero, new IntPtr(y * 0x10000 + x));
P.S. Я думал отладка сразу с правами запускается

Добавлено через 13 минут
Цитата Сообщение от Nalik Посмотреть сообщение
Над какой игрой эксперименты проводите?)

Не по теме:

Старая добрая линейка)

0
 Аватар для Nalik
176 / 124 / 49
Регистрация: 30.11.2012
Сообщений: 1,330
09.09.2015, 15:57
Для клавы я всегда посылал запросы вида:
C#
1
2
3
            PostMessage(hwnd, WM_KEYDOWN, (IntPtr)0x52, (IntPtr)0);
            Thread.Sleep(150);
            PostMessage(hwnd, WM_KEYUP, (IntPtr)0x52, (IntPtr)0);
Чтобы не работало не сталкивался с такой проблемой, потому не знаю) Только с клацаньем мышки)
Ну если Visual Studio запущен от админа, то отладка тоже вроде от админа должна быть)

Так же возможно Hwnd конечного окна поменялся, тоже как вариант проверить можно)
0
25 / 25 / 10
Регистрация: 27.11.2011
Сообщений: 272
09.09.2015, 16:34  [ТС]
Nalik, хм, PostMessage сработал, но сама программа жутко зависла, как будто я в ней число Пи считаю.
0
 Аватар для Nalik
176 / 124 / 49
Регистрация: 30.11.2012
Сообщений: 1,330
09.09.2015, 16:46
Цитата Сообщение от llFreeManll Посмотреть сообщение
Nalik, хм, PostMessage сработал, но сама программа жутко зависла, как будто я в ней число Пи считаю.
Я надеюсь вы запросы посылаете в отдельном потоке?)
0
25 / 25 / 10
Регистрация: 27.11.2011
Сообщений: 272
09.09.2015, 17:13  [ТС]
Nalik, отдельный поток быстродействием тоже не отличился) А вообще смысл в отдельном потоке для этой задачи?

Добавлено через 13 минут
Перезапустил комп и заново стартанул студию от админа, теперь заработал и SendMessage, но буквы все же не пишутся, структура сообщения должна быть такая:
XML
1
2
3
WM_KEYDOWN
WM_KEYCHAR
WM_KEYDOWN
Мой код:
C#
1
2
3
4
5
6
7
8
private void button1_Click(object sender, EventArgs e)
        {
            SendMessage(hWnd, WM_KEYDOWN, 0x4C, 0);
            Thread.Sleep(120);
            SendMessage(hWnd, WM_CHAR, 0x4C, 0);
            Thread.Sleep(120);
            SendMessage(hWnd, WM_KEYUP, 0x4C, 0);
        }
Но если отправить сообщения SendMessage(hWnd, WM_CHAR, 0x4C, 0); только вместо буквы указать ему функ. клавишу Enter или TAB - все работает.
0
25 / 25 / 10
Регистрация: 27.11.2011
Сообщений: 272
09.09.2015, 17:28  [ТС]
Нашел разницу между сообщениями от проги и сообщениями с клавиатуры, вот на скрине видно. Но как это исправить?
0
 Аватар для Nalik
176 / 124 / 49
Регистрация: 30.11.2012
Сообщений: 1,330
09.09.2015, 18:03
Цитата Сообщение от llFreeManll Посмотреть сообщение
А вообще смысл в отдельном потоке для этой задачи?
Ну смотря для какой задачи. Если у тебя разовое нажатие клавиши то да смысла нет. Если у тебя целый алгоритм действий, то чтобы форма не вешалась нужно использовать в потоке)

Что-то я не понял, т.е. программа посылает нажатие клавиши М отправляя код 77, а когда ручками нажимаете клавишу М то отправляется 109?

У вас так объявлено?
Кликните здесь для просмотра всего текста

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
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern int SendMessage(IntPtr hwnd, int wMsg, IntPtr wParam, IntPtr lParam);
        const int
            WM_LBUTTONDOWN = 0x201,   //Left mousebutton down
            WM_LBUTTONUP = 0x202,     //Left mousebutton up
            WM_LBUTTONDBLCLK = 0x203, //Left mousebutton doubleclick
            WM_RBUTTONDOWN = 0x204,   //Right mousebutton down
            WM_RBUTTONUP = 0x205,     //Right mousebutton up
            WM_RBUTTONDBLCLK = 0x206, //Right mousebutton doubleclick
            WM_KEYDOWN = 0x100,       //Key down
            WM_KEYUP = 0x101,         //Key up
            WM_MOUSEMOVE = 0x0200,
            WM_ACTIVATE = 0x0006,
            WM_QUERYOPEN = 0x0013,
            WM_SYSCOMMAND = 0x0112,
            WM_CHAR = 0x0102,
            WM_SYSKEYDOWN = 0x0104,
            WM_SYSKEYUP = 0x0105,
            WM_SETCURSOR = 0x0020,
            WM_MOUSEACTIVATE = 0x0021,
            CB_SETCURSEL = 0x014E,
            WM_MOUSEHOVER = 0x02A1,
            WM_MOUSELEAVE = 0x02A3,
            MK_CONTROL = 0x0008,
            MK_LBUTTON = 0x0001,
            MK_MBUTTON = 0x0010,
            MK_RBUTTON = 0x0002,
            MK_SHIFT = 0x0004,
            MK_XBUTTON1 = 0x0020,
            MK_XBUTTON2 = 0x0040,
            VK_LBUTTON = 0x01,  //Left mouse button 
            VK_RBUTTON = 0x02,  //Right mouse button 
            VK_CANCEL = 0x03,   //Control-break processing 
            VK_MBUTTON = 0x04,  //Middle mouse button (three-button mouse) 
            VK_BACK = 0x08,     //BACKSPACE key 
            VK_TAB = 0x09,      //TAB key 
            VK_CLEAR = 0x0C,    //CLEAR key 
            VK_RETURN = 0x0D,   //ENTER key 
            VK_SHIFT = 0x10,    //SHIFT key 
            VK_CONTROL = 0x11,  //CTRL key 
            VK_MENU = 0x12,     //ALT key 
            VK_PAUSE = 0x13,    //PAUSE key 
            VK_CAPITAL = 0x14,  //CAPS LOCK key 
            VK_ESCAPE = 0x1B,   //ESC key 
            VK_SPACE = 0x20,    //SPACEBAR 
            VK_PRIOR = 0x21,    //PAGE UP key 
            VK_NEXT = 0x22,     //PAGE DOWN key 
            VK_END = 0x23,      //END key 
            VK_HOME = 0x24,     //HOME key 
            VK_LEFT = 0x25,     //LEFT ARROW key 
            VK_UP = 0x26,       //UP ARROW key 
            VK_RIGHT = 0x27,    //RIGHT ARROW key 
            VK_DOWN = 0x28,     //DOWN ARROW key 
            VK_SELECT = 0x29,   //SELECT key 
            VK_PRINT = 0x2A,    //PRINT key
            VK_EXECUTE = 0x2B,  //EXECUTE key 
            VK_SNAPSHOT = 0x2C, //PRINT SCREEN key 
            VK_INSERT = 0x2D,   //INS key 
            VK_DELETE = 0x2E,   //DEL key 
            VK_HELP = 0x2F,     //HELP key
            VK_0 = 0x30, //0 key 
            VK_1 = 0x31, //1 key 
            VK_2 = 0x32, //2 key 
            VK_3 = 0x33, //3 key 
            VK_4 = 0x34, //4 key 
            VK_5 = 0x35, //5 key 
            VK_6 = 0x36, //6 key 
            VK_7 = 0x37, //7 key 
            VK_8 = 0x38, //8 key 
            VK_9 = 0x39, //9 key 
            VK_A = 0x41, //A key 
            VK_B = 0x42, //B key 
            VK_C = 0x43, //C key 
            VK_D = 0x44, //D key 
            VK_E = 0x45, //E key 
            VK_F = 0x46, //F key 
            VK_G = 0x47, //G key 
            VK_H = 0x48, //H key 
            VK_I = 0x49, //I key 
            VK_J = 0x4A, //J key 
            VK_K = 0x4B, //K key 
            VK_L = 0x4C, //L key 
            VK_M = 0x4D, //M key 
            VK_N = 0x4E, //N key 
            VK_O = 0x4F, //O key 
            VK_P = 0x50, //P key 
            VK_Q = 0x51, //Q key 
            VK_R = 0x52, //R key 
            VK_S = 0x53, //S key 
            VK_T = 0x54, //T key 
            VK_U = 0x55, //U key 
            VK_V = 0x56, //V key 
            VK_W = 0x57, //W key 
            VK_X = 0x58, //X key 
            VK_Y = 0x59, //Y key 
            VK_Z = 0x5A, //Z key
            VK_NUMPAD0 = 0x60, //Numeric keypad 0 key 
            VK_NUMPAD1 = 0x61, //Numeric keypad 1 key 
            VK_NUMPAD2 = 0x62, //Numeric keypad 2 key 
            VK_NUMPAD3 = 0x63, //Numeric keypad 3 key 
            VK_NUMPAD4 = 0x64, //Numeric keypad 4 key 
            VK_NUMPAD5 = 0x65, //Numeric keypad 5 key 
            VK_NUMPAD6 = 0x66, //Numeric keypad 6 key 
            VK_NUMPAD7 = 0x67, //Numeric keypad 7 key 
            VK_NUMPAD8 = 0x68, //Numeric keypad 8 key 
            VK_NUMPAD9 = 0x69, //Numeric keypad 9 key 
            VK_SEPARATOR = 0x6C, //Separator key 
            VK_SUBTRACT = 0x6D,  //Subtract key 
            VK_DECIMAL = 0x6E,   //Decimal key 
            VK_DIVIDE = 0x6F,    //Divide key
            VK_F1 = 0x70,  //F1 key 
            VK_F2 = 0x71,  //F2 key 
            VK_F3 = 0x72,  //F3 key 
            VK_F4 = 0x73,  //F4 key 
            VK_F5 = 0x74,  //F5 key 
            VK_F6 = 0x75,  //F6 key 
            VK_F7 = 0x76,  //F7 key 
            VK_F8 = 0x77,  //F8 key 
            VK_F9 = 0x78,  //F9 key 
            VK_F10 = 0x79, //F10 key 
            VK_F11 = 0x7A, //F11 key 
            VK_F12 = 0x7B, //F12 key
            VK_SCROLL = 0x91,   //SCROLL LOCK key 
            VK_LSHIFT = 0xA0,   //Left SHIFT key
            VK_RSHIFT = 0xA1,   //Right SHIFT key
            VK_LCONTROL = 0xA2, //Left CONTROL key
            VK_RCONTROL = 0xA3, //Right CONTROL key
            VK_LMENU = 0xA4,    //Left MENU key
            VK_RMENU = 0xA5,    //Right MENU key
            VK_PLAY = 0xFA,     //Play key
            VK_ZOOM = 0xFB;     //Zoom key
0
25 / 25 / 10
Регистрация: 27.11.2011
Сообщений: 272
09.09.2015, 18:33  [ТС]
Nalik, пока еще никак не объявлено, я задал код клавиши прямо в функции.
Цитата Сообщение от Nalik Посмотреть сообщение
Что-то я не понял, т.е. программа посылает нажатие клавиши М отправляя код 77, а когда ручками нажимаете клавишу М то отправляется 109?
Нет, это как раз был тест на функ. клавишу TAB - сработало норм, а вот текст не написало.
0
 Аватар для Nalik
176 / 124 / 49
Регистрация: 30.11.2012
Сообщений: 1,330
10.09.2015, 10:14
Цитата Сообщение от llFreeManll Посмотреть сообщение
Нет, это как раз был тест на функ. клавишу TAB - сработало норм, а вот текст не написало.
А где должен писаться текст? Если например писать текст в чате игры, то предполагаю что нужно там сначала сделать чат активным, например нажатием клавиши мышки или другим способом.
Честно говоря сейчас я уже не очень понимаю задачу, запросы в окно приходят, другое дело как и куда ты отправляешь запросы и как они обрабатываются.
0
25 / 25 / 10
Регистрация: 27.11.2011
Сообщений: 272
10.09.2015, 13:50  [ТС]
Nalik, да, чат. Но чат делается активным отпракой Enter'а, это сообшщение обрабатывается игрой, но вот коды самих клавиш нет(или не всегда). Если использовать event, то все работает нормально, но тогда окно игры должно быть активным, а этого бы не хотелось.
0
 Аватар для Nalik
176 / 124 / 49
Регистрация: 30.11.2012
Сообщений: 1,330
10.09.2015, 14:22
Цитата Сообщение от llFreeManll Посмотреть сообщение
да, чат. Но чат делается активным отпракой Enter'а, это сообшщение обрабатывается игрой, но вот коды самих клавиш нет(или не всегда). Если использовать event, то все работает нормально, но тогда окно игры должно быть активным, а этого бы не хотелось.
Проверь через spy++ чат имеет такой же дескриптор как и у основного окна. Может ты посылаешь запросы окну родителю, в то время как должен дочернему окну посылать.
0
25 / 25 / 10
Регистрация: 27.11.2011
Сообщений: 272
10.09.2015, 16:50  [ТС]
Nalik, handle один на все окно, я уже смотрел...

Добавлено через 1 час 42 минуты
Заметил в SPY что, когда я отправляю код клавиши "Т" программной, он равняется 84,а когда набираю Т на клавиатуре, то код становится 116 Как так.
0
 Аватар для Nalik
176 / 124 / 49
Регистрация: 30.11.2012
Сообщений: 1,330
10.09.2015, 17:44
Цитата Сообщение от llFreeManll Посмотреть сообщение
Заметил в SPY что, когда я отправляю код клавиши "Т" программной, он равняется 84,а когда набираю Т на клавиатуре, то код становится 116 Как так.
Программой посылаешь так?
C#
1
2
3
4
5
            SendMessage(hWnd, WM_KEYDOWN, 0x54, 0);
            Thread.Sleep(120);
            SendMessage(hWnd, WM_CHAR, 0x54, 0);
            Thread.Sleep(120);
            SendMessage(hWnd, WM_KEYUP, 0x54, 0);
А попробуй так ради эксперимента:
C#
1
2
3
4
5
            SendMessage(hWnd, WM_KEYDOWN, 0x74, 0);
            Thread.Sleep(120);
            SendMessage(hWnd, WM_CHAR, 0x74, 0);
            Thread.Sleep(120);
            SendMessage(hWnd, WM_KEYUP, 0x74, 0);
Самое главное сейчас это выяснить правильно ли обрабатываются твои запросы, т.е. в окно приходят именно те клавиши которые ты отправил. Потом можно будет мудрить с активной вкладкой чата.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.09.2015, 17:44
Помогаю со студенческими работами здесь

Защищенное соединение XP и 7?
Майкрософт вывел из обслуживания эти операционки. Может здесь найдется левша способный подковать самого богатого человека в мире.А то...

Защищенное API
Привет. Пишу клиент для сайта, как сделать API, чтобы нельзя было узнать адрес API?

Защищённое подключение в БД
Учебный пример wpf, хочу сделать подключение к БД, как будто бы я подключаю реальный проект) Не знаю как и куда присабачить Pooling =...

Защищенное соединение
Доброго времени суток! Что это значит?

Защищенное web приложение
Здравствуйте, у меня есть web-приложение на asp.net mvc 4. Теперь мне нужно установить защищенное tls соединение с помощью крипто про csp,...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это дополнительная запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru