Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
Вернулся
 Аватар для HackerVlad
1782 / 677 / 46
Регистрация: 10.09.2021
Сообщений: 2,840

Как правильно создать окно только для сообщений, используя CreateWindowEx?

02.08.2023, 20:37. Показов 3429. Ответов 63
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Итак, например мне захотелось использовать окно только для сообщений, и я не знаю с чего мне начать и как это сделать правильно, я ещё новичок. Но я понял, что можно создать окно только для сообщений двумя путями:

1) Сначала зарегистрировать свой собственный класс окна (а это геморно и долго), а потом уже создать окно только для сообщений
2) Использовать любой класс окна, хоть например BUTTON, а потом создать окно только для сообщений
3) Использовать системный класс "Message" при создании окна только для сообщений

И вот я ломаю голову как же поступить правильнее. Сразу скажу, что самое простое это использовать системный класс "Message" но так ли это правильно, а регистрировать свой собственный класс ой как не хочется (ну зачем же столько много лишнего кода!!!)

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

Вот моя идея такова, код:

Visual Basic
1
hMsgWindow = CreateWindowEx(0, StrPtr("Message"), 0, 0, 0, 0, 0, 0, HWND_MESSAGE, 0, App.hInstance, ByVal 0&)
Это действительно создаст окно только для сообщений! И ведь всего одна строчка кода! Так не хочется регистрировать класс ещё да и зачем? Кто что толкового скажет по этому поводу!?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.08.2023, 20:37
Ответы с готовыми решениями:

Как правильно активировать окно и переключить фокус клавиатуры на него в чужом потоке с использованием оконных сообщений
Я почитал инструкции которые здесь описаны...

Создать функции для вычисления n! и a^b, используя только только арифметические действия
Создать функцию для вычисления n! и ab, используя только только арифметические действия (+, –, :, ·). Вычислить выражения, используя...

Создать функции для вычисления n! и a^b , используя только только арифметические действия
Создать функции для вычисления n! и a^b ,используя только только арифметические действия (+, –, :, ). Вычислить выражения, используя...

63
Вернулся
 Аватар для HackerVlad
1782 / 677 / 46
Регистрация: 10.09.2021
Сообщений: 2,840
09.08.2023, 14:39  [ТС]
Студворк — интернет-сервис помощи студентам
Смысл мне тогда пользоваться очередью The Tricka если Tab вырубает

Добавлено через 8 минут
Я предполагаю что функция GetMessage основной очереди отрубает какие-то клавиатурные сообщения и они не доходят до формы вообще

Добавлено через 13 минут
В итоге моя очередь работает лучше (работают кнопки Tab, Enter на форме):

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
' Очередь
    Do While Not ExitProgram
'        lRet = GetMessage(MsgThreed, 0, 0, 0)
'
'        If lRet = -1 Then ' Error
'            Exit Do
'        ElseIf lRet = 0 Then
'            Exit Do
'        Else
'            TranslateMessage MsgThreed
'            DispatchMessage MsgThreed
'        End If
        
        WaitMessage
        DoEvents
    Loop
Добавлено через 31 минуту
Интересную вещь прочитал в MSDN:

Обратите внимание, что приложение отвечает за получение и отправку входных сообщений в диалоговое окно. Большинство приложений используют для этого основной цикл обработки сообщений. Однако, чтобы позволить пользователю перемещаться и выбирать элементы управления с помощью клавиатуры, приложение должно вызвать IsDialogMessage . Дополнительные сведения см. в разделе Интерфейс клавиатуры диалогового окна .

Добавлено через 1 минуту
Что я заметил: клавиатура так же не работает на MsgBox ни клавиша Esc, ни клавиша Enter

Добавлено через 5 минут
" Однако, чтобы позволить пользователю перемещаться и выбирать элементы управления с помощью клавиатуры, приложение должно вызвать IsDialogMessage ." Что это значит вообще!?

Добавлено через 1 минуту
Самое смешное в моей очереди

Visual Basic
1
2
3
4
Do While Not ExitProgram
        WaitMessage
        DoEvents
    Loop
начинает работать клавиатура в форме, но всё так же не работает в MsgBox'ах

Добавлено через 1 минуту
Но если MsgBox был вызван из формы то клавиатура работает. Как только MsgBox вызывается из потока а не из формы то клавиатура уже не работает на msgbpx

Добавлено через 8 минут
Нихрена не понял конечно, как IsDialogMessage может включить мне клавиатуру и кнопку Tab..

Добавлено через 11 минут
Ещё бы знать как пользоваться этой функцией IsDialogMessage примеров кода ноль, особенно с очередью сообщений

Добавлено через 3 минуты
Это слишком сложно получается

Добавлено через 2 минуты
В сто раз проще использовать мою очередь:

Visual Basic
1
2
3
4
Do While Not ExitProgram       
        WaitMessage
        DoEvents
    Loop
Код гораздо проще и имеет только одну API-функцию, а не три. Потом мне не надо голову ломать над тем как "оживить" клавиатуру чтобы работал Tab и так далее. В msgbox'ах тоже работает клавиатура. Получается что мой код гораздо лучше чем у The Trick

Добавлено через 5 минут
Я не вижу никаких причин для того чтобы использовать код очереди по технологии The Trick'а - кода гораздо больше, сложнее, ещё и клавиатура вырубается. DoEvents наверное уже сам обрабатывает клавиатуру как надо. Мой код проще в 100 раз.
0
Модератор
10069 / 3914 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 79
09.08.2023, 14:42
Ты сначала говоришь об одном (что у тебя приложение без форм), а теперь приплел обработку сообщений. Скажу тебе по секрету что в вб и так есть обработчик сообщений и твой код вообще не нужен.

Добавлено через 1 минуту

Не по теме:

И завязывай спамить своим потоком сознания у меня вся почта из-за тебя завалена уведомлениями.

0
Вернулся
 Аватар для HackerVlad
1782 / 677 / 46
Регистрация: 10.09.2021
Сообщений: 2,840
09.08.2023, 15:24  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
Ты сначала говоришь об одном (что у тебя приложение без форм)
Без формы по началу, форма вызывается по требованию (либо по нажатию горячих клавиш, либо из трея) но даже если было бы и вообще без формы, клавиатура всё равно не работала бы в msgbox'ах с твоей очередью, как ты советовал

Добавлено через 2 минуты
Цитата Сообщение от The trick Посмотреть сообщение
Нет. GetMessage/TranslateMessage/DisaptchMessage.
И не работает клавиатура при этом!!!

Добавлено через 1 минуту
Цитата Сообщение от The trick Посмотреть сообщение
Ты сначала говоришь об одном (что у тебя приложение без форм)
Без формы по началу, форма вызывается по требованию (либо по нажатию горячих клавиш, либо из трея) но даже если было бы и вообще без формы, клавиатура всё равно не работала бы в msgbox'ах с твоей очередью, как ты советовал
Цитата Сообщение от The trick Посмотреть сообщение
Скажу тебе по секрету что в вб и так есть обработчик сообщений
Знать бы ещё как он выглядит для формы стандартной, он же как-то клавиатуру оживляет

Добавлено через 52 секунды
Цитата Сообщение от The trick Посмотреть сообщение
и твой код вообще не нужен
Какой код не нужен?

Добавлено через 5 минут
Без формы по началу, чтобы экономить оперативную память))) В большинстве случаев программа будет висеть в трее и форма вызываться вообще не будет. Поэтому загружать форму, а потом скрывать её через Form1.Hide это слишком накладно. Ибо жрёт ресурсы. Поэтому я решил загружать программу сначала вообще без формы полностью, чтобы экономить память. Я это делаю впервые и столкнулся с многими трудностями тут, как видишь. Основная трудность - клавиатура.

Добавлено через 21 минуту
Искал исходный код функции DoEvents, нашёл вот тут: https://stackoverflow.com/ques... lent-for-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
void DoEvents()
{
    MSG msg;
    BOOL result;
 
    while ( ::PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE ) )
    {
        result = ::GetMessage(&msg, NULL, 0, 0);
        if (result == 0) // WM_QUIT
        {                
            ::PostQuitMessage(msg.wParam);
            break;
        }
        else if (result == -1)
        {
             // Handle errors/exit application, etc.
        }
        else 
        {
            ::TranslateMessage(&msg);
            :: DispatchMessage(&msg);
        }
    }
}
0
Вернулся
 Аватар для HackerVlad
1782 / 677 / 46
Регистрация: 10.09.2021
Сообщений: 2,840
10.08.2023, 14:56  [ТС]
Видимо я всем надоел)))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.08.2023, 14:56

Используя иерархию и наследование, создать классы окно, окно с заголовком и окно с кнопкой
Используя иерархию и наследование, создать классы окно, окно с заголовком и окно с кнопкой. C++

Как создать контрол WinForms через CreateWindowEx?
Необходимо создать контрол WindowsForms через CreateWindowEx(). Spy++ показывает, например,...

CreateWindowEx() не создает окно
Работаю в VS 2013 Express, Юникод в настройках включен, GetLastError возвращает 0, CreateWindowEx возвращает 0. CreateWindowEx всего один,...

Как правильно создать окно MCI?
Как правильно создать окно MCI? Сделал как пишется здесь,но выдает ошибки: Unit1.cpp(21): E2268 Call to undefined function...

Как правильно создать второе окно?
Наверное я плохо искал, но понятного решения не нашел.Создаю вторую форму так же, как и создавал первую Справа в обозревателе с помощью...


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

Или воспользуйтесь поиском по форуму:
64
Ответ Создать тему
Новые блоги и статьи
Транслитерация текста с кириллицы на латиницу (вариант №2)
Maks 13.11.2026
Обновленная версия ранее созданной обработки. Добавлено: - Проверка исходного текста на кириллицу, через обращение к стандартной функции "ТолькоКириллицаВСтроке" из общего модуля. . .
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы. Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru