Вернулся
 Аватар для HackerVlad
1753 / 649 / 45
Регистрация: 10.09.2021
Сообщений: 2,803

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

02.08.2023, 20:37. Показов 3194. Ответов 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
1753 / 649 / 45
Регистрация: 10.09.2021
Сообщений: 2,803
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
Модератор
10065 / 3910 / 885
Регистрация: 22.02.2013
Сообщений: 5,860
Записей в блоге: 79
09.08.2023, 14:42
Ты сначала говоришь об одном (что у тебя приложение без форм), а теперь приплел обработку сообщений. Скажу тебе по секрету что в вб и так есть обработчик сообщений и твой код вообще не нужен.

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

Не по теме:

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

0
Вернулся
 Аватар для HackerVlad
1753 / 649 / 45
Регистрация: 10.09.2021
Сообщений: 2,803
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
1753 / 649 / 45
Регистрация: 10.09.2021
Сообщений: 2,803
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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru