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

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

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

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

Не по теме:

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

0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
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
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
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
Ответ Создать тему
Новые блоги и статьи
[golang] Конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов.
alhaos 10.06.2026
Задача Реализовать конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов. Сигнатура func Fetch(urls string, maxConcurrent int) Result Пример urls :=. . .
[golang] Состояние гонки (race condition)
alhaos 10.06.2026
Состояние гонки (race condition) Состояние гонки (Race Condition) — это ошибка, возникающая при одновременном доступе нескольких горутин к одним и тем же данным без должной синхронизации. При этом. . .
Взрослые отношения, и почему они не получаются
kumehtar 09.06.2026
Когда в детстве ребёнок не получает от родителей чего-то важного, он лишается не просто приятных переживаний, а основы для формирования определённых внутренних качеств и навыков. Если ребёнок не. . .
[golang] Worker Pool
alhaos 09.06.2026
Worker Pool Worker Pool — паттерн конкурентной обработки задач в Go. Суть: фиксированное количество горутин-воркеров читают задачи из общего канала и пишут результаты в общий канал результатов. . . .
[golang] Pipeline
alhaos 08.06.2026
Pipeline Pipeline — паттерн конкурентной обработки данных в Go. Суть: данные проходят через цепочку независимых стадий, каждая из которых работает в своей горутине и общается с соседями через. . .
Свет внутри себя
kumehtar 07.06.2026
Пусть это будет здесь lIs4oanZS9Y
Программа для com-порта
Uhbif79 05.06.2026
Всем привет, давно хотел изучить Qt, начинал, бросал, потом снова начинал. И сейчас вот смог написать свою первую программу. До этого имел опыт программирования микроконтроллеров, писал прошивки на. . .
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru