Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/48: Рейтинг темы: голосов - 48, средняя оценка - 4.77
1 / 1 / 0
Регистрация: 26.10.2014
Сообщений: 74

Встраивание окна внешнего приложения в форму

10.11.2014, 18:21. Показов 9351. Ответов 19

Студворк — интернет-сервис помощи студентам
Привет всем! Проблема такая, требуется встроить стороннее приложение в форму моей программы, причем это встроенное окно должно быть определенного размера и занимать фиксированное место на форме.

Я пришел к выводу, что нужно делать импорт dll-ки user32.dll [DllImport("user32.dll")] и каким-то образом использовать встроенную функцию SetWindowPos. Нагуглил такую страницу с описанием функции:
http://msdn.microsoft.com/ru-r... s.85).aspx
Но синтаксис там описан на С++, к тому же мне, как новичку, непонятно, как вызывать такую функцию, что за аргументы _In_ HWND hWnd, _In_opt_ HWND hWndInsertAfter и т.д.?

Или нужно действовать другим образом?
Подскажите, пожалуйста
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.11.2014, 18:21
Ответы с готовыми решениями:

Получить форму из внешнего окна
Суть: Есть запущенное приложение "TestProg22". Из моей программы нужно получить доступ до этого приложения а именно к его форме(или к...

Запуск внешнего приложения в форму
Доброго времени суток! https://www.cyberforum.ru/delphi-beginners/thread274393-page3.html А как сделать, если заголовок окна...

Встраивание программы в окно приложения
Подскажите, пожалуйста! Можно ли внешнее приложение, зная его WId, встроить в элемент интерфейса Delphi? Например, на С++Qt есть...

19
 Аватар для ViterAlex
8951 / 4863 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
10.11.2014, 19:02
Лучший ответ Сообщение было отмечено ctakah3112 как решение

Решение

Так встроить:
Каким образом можно открыть приложение в форме так, чтобы оно являлось дочерним окном?
А задать ещё и положение и размер чуть сложнее:
C#
1
2
3
4
5
6
7
8
9
private void button1_Click(object sender, EventArgs e) {
    Process p = Process.Start("calc.exe");
    Thread.Sleep(500);
    p.WaitForInputIdle();
 
    WinAPI.SetWindowPos(p.MainWindowHandle, this.Handle, 10, 10, 200, 200, WinAPI.SetWindowPosFlags.DrawFrame|WinAPI.SetWindowPosFlags.ShowWindow);
    WinAPI.SetParent(p.MainWindowHandle, this.Handle);
    this.WindowState = FormWindowState.Maximized;
}
Вспомогательный класс WinAPI
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
static class WinAPI {
    [Flags()]
    internal enum SetWindowPosFlags : uint {
        /// <summary>If the calling thread and the thread that owns the window are attached to different input queues, 
        /// the system posts the request to the thread that owns the window. This prevents the calling thread from 
        /// blocking its execution while other threads process the request.</summary>
        /// <remarks>SWP_ASYNCWINDOWPOS</remarks>
        AsynchronousWindowPosition = 0x4000,
        /// <summary>Prevents generation of the WM_SYNCPAINT message.</summary>
        /// <remarks>SWP_DEFERERASE</remarks>
        DeferErase = 0x2000,
        /// <summary>Draws a frame (defined in the window's class description) around the window.</summary>
        /// <remarks>SWP_DRAWFRAME</remarks>
        DrawFrame = 0x0020,
        /// <summary>Applies new frame styles set using the SetWindowLong function. Sends a WM_NCCALCSIZE message to 
        /// the window, even if the window's size is not being changed. If this flag is not specified, WM_NCCALCSIZE 
        /// is sent only when the window's size is being changed.</summary>
        /// <remarks>SWP_FRAMECHANGED</remarks>
        FrameChanged = 0x0020,
        /// <summary>Hides the window.</summary>
        /// <remarks>SWP_HIDEWINDOW</remarks>
        HideWindow = 0x0080,
        /// <summary>Does not activate the window. If this flag is not set, the window is activated and moved to the
        /// top of either the topmost or non-topmost group (depending on the setting of the hWndInsertAfter 
        /// parameter).</summary>
        /// <remarks>SWP_NOACTIVATE</remarks>
        DoNotActivate = 0x0010,
        /// <summary>Discards the entire contents of the client area. If this flag is not specified, the valid 
        /// contents of the client area are saved and copied back into the client area after the window is sized or 
        /// repositioned.</summary>
        /// <remarks>SWP_NOCOPYBITS</remarks>
        DoNotCopyBits = 0x0100,
        /// <summary>Retains the current position (ignores X and Y parameters).</summary>
        /// <remarks>SWP_NOMOVE</remarks>
        IgnoreMove = 0x0002,
        /// <summary>Does not change the owner window's position in the Z order.</summary>
        /// <remarks>SWP_NOOWNERZORDER</remarks>
        DoNotChangeOwnerZOrder = 0x0200,
        /// <summary>Does not redraw changes. If this flag is set, no repainting of any kind occurs. This applies to 
        /// the client area, the nonclient area (including the title bar and scroll bars), and any part of the parent 
        /// window uncovered as a result of the window being moved. When this flag is set, the application must 
        /// explicitly invalidate or redraw any parts of the window and parent window that need redrawing.</summary>
        /// <remarks>SWP_NOREDRAW</remarks>
        DoNotRedraw = 0x0008,
        /// <summary>Same as the SWP_NOOWNERZORDER flag.</summary>
        /// <remarks>SWP_NOREPOSITION</remarks>
        DoNotReposition = 0x0200,
        /// <summary>Prevents the window from receiving the WM_WINDOWPOSCHANGING message.</summary>
        /// <remarks>SWP_NOSENDCHANGING</remarks>
        DoNotSendChangingEvent = 0x0400,
        /// <summary>Retains the current size (ignores the cx and cy parameters).</summary>
        /// <remarks>SWP_NOSIZE</remarks>
        IgnoreResize = 0x0001,
        /// <summary>Retains the current Z order (ignores the hWndInsertAfter parameter).</summary>
        /// <remarks>SWP_NOZORDER</remarks>
        IgnoreZOrder = 0x0004,
        /// <summary>Displays the window.</summary>
        /// <remarks>SWP_SHOWWINDOW</remarks>
        ShowWindow = 0x0040,
    }
    /// <summary>
    /// Задание положения окна
    /// </summary>
    /// <param name="hWnd">Дескриптор окна</param>
    /// <param name="hWndInsertAfter">Дескриптор родительского окна</param>
    /// <param name="X">Положение по горизонтали</param>
    /// <param name="Y">Положение по вертикали</param>
    /// <param name="cx">Ширина</param>
    /// <param name="cy">Высота</param>
    /// <param name="uFlags">Флаги</param>
    /// <returns></returns>
    [DllImport("user32.dll", SetLastError = true)]
    internal static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, SetWindowPosFlags uFlags);
    [DllImport("user32.dll", SetLastError = true)]
    internal static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
    [DllImport("user32.dll", SetLastError = true)]
    internal static extern IntPtr FindWindow(IntPtr ZeroOnly, string lpWindowName);
}
1
1 / 1 / 0
Регистрация: 26.10.2014
Сообщений: 74
10.11.2014, 21:15  [ТС]
Спасибо большое, работает! )
Но что если ситуация такая, что если это внешнее приложение вообще не поддерживает изменения размера своего окна? (даже когда просто его запускаешь, нельзя ни расширить, ни сузить). Соответственно этот код применительно к нему не работает. Тут уже ничего поделать нельзя?
0
 Аватар для ViterAlex
8951 / 4863 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
10.11.2014, 21:18
Ну вот калькулятор из примера тоже нельзя ни расширить ни сузить, но с ним работает
0
1 / 1 / 0
Регистрация: 26.10.2014
Сообщений: 74
10.11.2014, 21:36  [ТС]
да, с калькулятором работает. Ну, значит приложение такое(
0
 Аватар для ViterAlex
8951 / 4863 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
10.11.2014, 23:48
Ну что ты расстраиваешьс . Я же не сказал, что нельзя. Можно через SetWindowLong. Но сначала надо бы через spy++ посмотреть стиль твоего окна, чтобы знать что менять
0
1 / 1 / 0
Регистрация: 26.10.2014
Сообщений: 74
11.11.2014, 14:19  [ТС]
Что я должен сделать? я запустил Spy++ и кажется нашел то самое окно. В раскрывающемся списке видно, что оно состоит из нескольких подокон как бы. Какая именно информация нужна?
0
 Аватар для ViterAlex
8951 / 4863 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
12.11.2014, 06:57
Открыть поиск окна:

Найти окно и нажать ОК. Появятся свойства окна, в которых нас интересует вкладка Styles:


Если ты нашёл окно в основном дереве программы, то ПКМ→Properties
0
1 / 1 / 0
Регистрация: 26.10.2014
Сообщений: 74
12.11.2014, 14:07  [ТС]
Я нашел окно в списке, кажется, то самое.
Вот его свойства:



Что делать дальше?)
0
 Аватар для ViterAlex
8951 / 4863 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
13.11.2014, 19:29
А дальше нужно получить стиль окна и изменить его, чтобы окно могло менять свой размер.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
private void button1_Click(object sender, EventArgs e) {
    Process p = Process.Start("calc.exe");
    Thread.Sleep(500);
    p.WaitForInputIdle();
    IntPtr hwnd = p.MainWindowHandle;
    //Стиль окна
    int windowLong = WinAPI.GetWindowLong(hwnd, (int)WinAPI.WindowLongFlags.GWL_STYLE);
    //Добавляем стиль, чтобы окно могло менять свой размер
    WinAPI.SetWindowLong(hwnd, (int)WinAPI.WindowLongFlags.GWL_STYLE, (int)WinAPI.WindowStyle.WS_THICKFRAME | windowLong);
    WinAPI.SetWindowPos(hwnd, this.Handle, 10, 10, 200, 200, WinAPI.SetWindowPosFlags.DrawFrame | WinAPI.SetWindowPosFlags.ShowWindow);
    WinAPI.SetParent(hwnd, this.Handle);
    this.WindowState = FormWindowState.Maximized;
}
Вспомогательный класс WinAPI
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
static class WinAPI {
    internal enum WindowLongFlags : int {
        GWL_EXSTYLE = -20,
        GWLP_HINSTANCE = -6,
        GWLP_HWNDPARENT = -8,
        GWL_ID = -12,
        GWL_STYLE = -16,
        GWL_USERDATA = -21,
        GWL_WNDPROC = -4,
        DWLP_USER = 0x8,
        DWLP_MSGRESULT = 0x0,
        DWLP_DLGPROC = 0x4
    }
    [Flags()]
    internal enum WindowStyle : uint {
        WS_BORDER = 0x00800000,
        WS_CAPTION = 0x00C00000,
        WS_CHILD = 0x40000000,
        WS_CLIPCHILDREN = 0x02000000,
        WS_CLIPSIBLINGS = 0x04000000,
        WS_DISABLED = 0x08000000,
        WS_DLGFRAME = 0x00400000,
        WS_GROUP = 0x00020000,
        WS_HSCROLL = 0x00100000,
        WS_MAXIMIZE = 0x01000000,
        WS_MAXIMIZEBOX = 0x00010000,
        WS_MINIMIZE = 0x20000000,
        WS_MINIMIZEBOX = 0x00020000,
        WS_OVERLAPPED = 0x00000000,
        WS_POPUP = 0x80000000,
        WS_POPUPWINDOW = WS_BORDER | WS_SYSMENU | WS_POPUP,
        WS_OVERLAPPEDWINDOW = WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME,
        WS_SIZEBOX = 0x00040000,
        WS_SYSMENU = 0x00080000,
        WS_TABSTOP = 0x00010000,
        WS_THICKFRAME = WS_SIZEBOX,
        WS_TILED = WS_OVERLAPPED,
        WS_TILEDWINDOW = WS_OVERLAPPEDWINDOW,
        WS_VISIBLE = 0x10000000,
        WS_VSCROLL = 0x00200000
    }
    [Flags()]
    internal enum SetWindowPosFlags : uint {
        /// <summary>If the calling thread and the thread that owns the window are attached to different input queues, 
        /// the system posts the request to the thread that owns the window. This prevents the calling thread from 
 
        /// blocking its execution while other threads process the request.</summary>
        /// <remarks>SWP_ASYNCWINDOWPOS</remarks>
        AsynchronousWindowPosition = 0x4000,
        /// <summary>Prevents generation of the WM_SYNCPAINT message.</summary>
        /// <remarks>SWP_DEFERERASE</remarks>
        DeferErase = 0x2000,
        /// <summary>Draws a frame (defined in the window's class description) around the window.</summary>
        /// <remarks>SWP_DRAWFRAME</remarks>
        DrawFrame = 0x0020,
        /// <summary>Applies new frame styles set using the SetWindowLong function. Sends a WM_NCCALCSIZE message to 
        /// the window, even if the window's size is not being changed. If this flag is not specified, WM_NCCALCSIZE 
        /// is sent only when the window's size is being changed.</summary>
        /// <remarks>SWP_FRAMECHANGED</remarks>
        FrameChanged = 0x0020,
        /// <summary>Hides the window.</summary>
        /// <remarks>SWP_HIDEWINDOW</remarks>
        HideWindow = 0x0080,
        /// <summary>Does not activate the window. If this flag is not set, the window is activated and moved to the
        /// top of either the topmost or non-topmost group (depending on the setting of the hWndInsertAfter 
        /// parameter).</summary>
        /// <remarks>SWP_NOACTIVATE</remarks>
        DoNotActivate = 0x0010,
        /// <summary>Discards the entire contents of the client area. If this flag is not specified, the valid 
        /// contents of the client area are saved and copied back into the client area after the window is sized or 
        /// repositioned.</summary>
        /// <remarks>SWP_NOCOPYBITS</remarks>
        DoNotCopyBits = 0x0100,
        /// <summary>Retains the current position (ignores X and Y parameters).</summary>
        /// <remarks>SWP_NOMOVE</remarks>
        IgnoreMove = 0x0002,
        /// <summary>Does not change the owner window's position in the Z order.</summary>
        /// <remarks>SWP_NOOWNERZORDER</remarks>
        DoNotChangeOwnerZOrder = 0x0200,
        /// <summary>Does not redraw changes. If this flag is set, no repainting of any kind occurs. This applies to 
        /// the client area, the nonclient area (including the title bar and scroll bars), and any part of the parent 
        /// window uncovered as a result of the window being moved. When this flag is set, the application must 
        /// explicitly invalidate or redraw any parts of the window and parent window that need redrawing.</summary>
        /// <remarks>SWP_NOREDRAW</remarks>
        DoNotRedraw = 0x0008,
        /// <summary>Same as the SWP_NOOWNERZORDER flag.</summary>
        /// <remarks>SWP_NOREPOSITION</remarks>
        DoNotReposition = 0x0200,
        /// <summary>Prevents the window from receiving the WM_WINDOWPOSCHANGING message.</summary>
        /// <remarks>SWP_NOSENDCHANGING</remarks>
        DoNotSendChangingEvent = 0x0400,
        /// <summary>Retains the current size (ignores the cx and cy parameters).</summary>
        /// <remarks>SWP_NOSIZE</remarks>
        IgnoreResize = 0x0001,
        /// <summary>Retains the current Z order (ignores the hWndInsertAfter parameter).</summary>
        /// <remarks>SWP_NOZORDER</remarks>
        IgnoreZOrder = 0x0004,
        /// <summary>Displays the window.</summary>
        /// <remarks>SWP_SHOWWINDOW</remarks>
        ShowWindow = 0x0040,
    }
    /// <summary>
    /// Задание положения окна
    /// </summary>
    /// <param name="hWnd">Дескриптор окна</param>
    /// <param name="hWndInsertAfter">Дескриптор родительского окна</param>
    /// <param name="X">Положение по горизонтали</param>
    /// <param name="Y">Положение по вертикали</param>
    /// <param name="cx">Ширина</param>
    /// <param name="cy">Высота</param>
    /// <param name="uFlags">Флаги</param>
    [DllImport("user32.dll", SetLastError = true)]
    internal static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, SetWindowPosFlags uFlags);
    [DllImport("user32.dll", SetLastError = true)]
    internal static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
    [DllImport("user32.dll", SetLastError = true)]
    internal static extern IntPtr FindWindow(IntPtr ZeroOnly, string lpWindowName);
    [DllImport("user32.dll", SetLastError = true)]
    internal static extern int GetWindowLong(IntPtr hWnd, int nIndex);
    /// <summary>
    /// Изменение атрибутов указанного окна
    /// </summary>
    /// <param name="hWnd">Дескриптор окна</param>
    /// <param name="nIndex">Смещение от нуля значения, которое нужно Изменить.</param>
    /// <param name="dwNewLong">Новое значение</param>
    [DllImport("user32.dll")]
    internal static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
    internal const int GWL_STYLE = 16;
}

В результате окно калькулятора встроено в форму и может менять свой размер
Миниатюры
Встраивание окна внешнего приложения в форму  
0
1 / 1 / 0
Регистрация: 26.10.2014
Сообщений: 74
13.11.2014, 20:42  [ТС]
Спасибо, вот какую программу не попробую, для всех работает. А для моего долбаного приложения - нет .

Что в прошлой попытке, что в этой, результат такой: вместо захваченного окна конкретного размера, появляется кусок рабочего стола в рамке этого размера, а мое приложение так и остается незахваченным и, соответственно, так и не управляется по размеру.
0
 Аватар для ViterAlex
8951 / 4863 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
14.11.2014, 18:34
На этом мои знания заканчиваются и начинаются догадки. Нужно пробовать применить различные стили к окну, которых оно ещё не имеет. Попробуй включить стиль WS_MAXIMIZEBOX
0
0 / 0 / 2
Регистрация: 09.01.2014
Сообщений: 36
15.09.2015, 19:59
Win 7 64
Пытаюсь загрузить стороннее приложение к себе на форму при помощи этого кода. Да калькулятор загружается, но нужная программа загружается не в моей форме, а сама по себе.

На winxp sp 3 все работает.
Где копать?
0
 Аватар для ViterAlex
8951 / 4863 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
16.09.2015, 02:03
Попробуй вместо int поставить int64
0
0 / 0 / 2
Регистрация: 09.01.2014
Сообщений: 36
16.09.2015, 08:19
Сегодня пришел на работу, проверил на нескольких компах с windows 7 ultimate везде работает. Похоже проблема в моем софте.
0
0 / 0 / 0
Регистрация: 10.06.2015
Сообщений: 86
05.06.2016, 12:08
ViterAlex, сделала так же как у вас, но показывает p.WaitForInputIdle();-здесь ошибку(

Добавлено через 17 часов 0 минут
ctakah3112, Здравствуйте, а вы решили эту проблему?
0
 Аватар для ViterAlex
8951 / 4863 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
05.06.2016, 22:03
Цитата Сообщение от An_Ya Посмотреть сообщение
показывает p.WaitForInputIdle();-здесь ошибку(
Какую ошибку?
0
0 / 0 / 0
Регистрация: 10.06.2015
Сообщений: 86
06.06.2016, 00:16
ViterAlex, А нет уже не показывает, до этого выводило что не возможно так.
0
0 / 0 / 0
Регистрация: 10.06.2015
Сообщений: 86
06.06.2016, 01:04
ViterAlex, а вы не знаете как это исправить?
Миниатюры
Встраивание окна внешнего приложения в форму  
0
0 / 0 / 0
Регистрация: 10.06.2015
Сообщений: 86
06.06.2016, 01:10
ViterAlex, или как поменять MainWindowHandle на EnumThreadWindows- написано если с main не работает то с enam может будет, я новичок, совсем не знаю как
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.06.2016, 01:10
Помогаю со студенческими работами здесь

Встраивание программы в окно приложения qt
Подскажите, пожалуйста! Можно ли внешнее приложение не просто запускать QProcess`ом, а встроить его в свое окно? В Qt4 был для...

Встраивание своих элементов в системные приложения
Доброго времени. В процессе обдумывания очередного мега популярного проекта возник вопрос: Возможно ли встраивать в активити системных...

Открыть форму внешнего отчета
Приветствую знатоков. Вопрос таков: конфигурация УТ 11.1.9.51 платформа 8 3 5 1460 права пользя - администратор , полные права ...

Вид внешнего окна формы
Приветствую. Подскажите пожалуйста, как изменить вид самой формы со стандартной на свою ? Желательно ссылки с примерами или...

Настройка внешнего вида окна
При клике на папке, она нормально открывается, но панель навигации (стрелки 'вверх', 'вперед', 'назад' и пр.) пропала абсолютно. В чем...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru