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

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

02.08.2023, 20:37. Показов 3047. Ответов 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
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
07.08.2023, 09:50
HackerVlad, а теперь внимательно проверь свои декларации api.
1
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
07.08.2023, 10:34  [ТС]
The trick, ты нашёл где-то ошибку у меня?

Добавлено через 1 минуту
The trick, скажи хоть какая функция, я пока не вижу ошибок в декларациях

Добавлено через 1 минуту
The trick, DefWindowProc может?

Добавлено через 1 минуту
ну какая у меня может быть ошибка? я пока не вижу ошибок... DefWindowProcW что ли использовать вместо DefWindowProcA

Добавлено через 1 минуту
Блин, реально кажется ошибка

Добавлено через 2 минуты
The trick, аааа ну всё ясно откуда опять эта ошибка пошла, это всё из того API вьювера что ты мне посоветовал однажды... сколько уже ошибок из-за него...

Добавлено через 21 секунду
как обычно поверил АПи вьюверу и ничего не проверял

Добавлено через 34 секунды
удалить его что ли со злости этот API вьювер блин

Добавлено через 1 минуту
Там и правда стоит ByVal wParam As Integer вместо ByVal wParam As Long

Добавлено через 2 минуты
Ура!!!!! Теперь исчезла 6 ошибка!!!! Ура!!!!!

Добавлено через 55 секунд
The trick, спасибо большое

Добавлено через 1 минуту
Теперь работает даже так:

Visual Basic
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
Private Function ReceiverWndProc( _
                 ByVal hwnd As Long, _
                 ByVal lMsg As Long, _
                 ByVal wParam As Long, _
                 ByVal lParam As Long) As Long
    
    Select Case lMsg
        Case WM_MOUSEMOVE
            If lParam = WM_LBUTTONUP Then
                MsgBox "LeftClick"
            End If
        Case WM_HOTKEY
            If wParam = 88001 Then
                ExitProgram = True
                KillTimer hMsgWindow, 0
                Unload Form1
            End If
            If wParam = 88002 Then
                Form1.Show
                KillTimer hMsgWindow, 0
            End If
            ReceiverWndProc = DefWindowProc(hwnd, lMsg, wParam, lParam)
        Case Else
            ReceiverWndProc = DefWindowProc(hwnd, lMsg, wParam, lParam)
    End Select
End Function
Хотя эта строчка "ReceiverWndProc = DefWindowProc(hwnd, lMsg, wParam, lParam)" и не нужна в WM_HOTKEY

Добавлено через 3 минуты
Лучше уже пользоваться стандартным API вьювером чем этим что ты мне насоветовал уже сколько ошибок мы видели в нём
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
07.08.2023, 10:36  [ТС]
Лучше уже пользоваться стандартным API вьювером чем этим что ты мне насоветовал уже сколько ошибок мы видели в нём
Миниатюры
Как правильно создать окно только для сообщений, используя CreateWindowEx?  
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
07.08.2023, 11:06  [ТС]
API вьювер удалять наверное надо, устал плакать из-за этих ошибок уже

Добавлено через 52 секунды
Теперь уже точно ему доверять не буду ибо ни первый раз уже

Добавлено через 23 минуты
Цитата Сообщение от The trick Посмотреть сообщение
Ничего сложного. Класс регистрируется для того чтобы как минимум иметь возможность обрабатывать сообщения.
Ты ведь сразу мне об этом сказал, а я тогда, глупый, не понимал ещё этого. Я не знал, что так легко и просто можно обрабатывать сообщения. Я думал, как дурак, что только через сабклассинг... Я же говорю, я только учусь ещё...

Спасибо, я так многое узнал теперь можно спокойно обрабатывать сообщения без всяких там сабклассингов это так клёво)

Добавлено через 2 минуты
В программах на C++ наверное вообще везде есть сразу оконные процедуры для перехвата сообщений. А VB'шный программист ничего толком не знает про сообщения окон вообще...

Добавлено через 57 секунд
С лучше язык получается для таких тонких вещей
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
07.08.2023, 18:22  [ТС]
The trick, в разных твоих примерах для определения размера структуры использует то LenB то Len, а что правильно на самом деле? .cbSize = LenB(tClass) или .cbSize = Len(tClass)
0
1401 / 860 / 92
Регистрация: 08.02.2017
Сообщений: 3,663
Записей в блоге: 2
07.08.2023, 19:09
Цитата Сообщение от HackerVlad Посмотреть сообщение
то LenB то Len
Вроде бы разница есть только для типа String, для остальных одинаково Len и LenB, но подозреваю, что LenB может быть чуть быстрее.
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
07.08.2023, 19:12  [ТС]
Ну The Trick наверное скажет что LenB лучше...

Добавлено через 1 минуту
Вряд ли в структурах вообще будут String плавающей длины тем более

Добавлено через 27 секунд
В структуре WNDCLASSEX есть строка, но только указатель на строку, а он всегда 4 байта
0
1401 / 860 / 92
Регистрация: 08.02.2017
Сообщений: 3,663
Записей в блоге: 2
07.08.2023, 19:50
Что интересно, если в типе (структуре) задать строку фиксированной длины, то Len и LenB для этой структуры будет разный.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Private Type strstr1
  s As String * 8
  i As Integer
End Type
Private Type strstr2
  s As String
End Type
 
Sub sfsf()
    Dim a As strstr1, b As strstr2
    Debug.Print Len(a) '  вернет 10
    Debug.Print LenB(a) ' вернет 18
End Sub
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
07.08.2023, 20:24  [ТС]
testuser2, ну да, так и должно быть
0
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
07.08.2023, 20:31
Цитата Сообщение от HackerVlad Посмотреть сообщение
API вьювер удалять наверное надо, устал плакать из-за этих ошибок уже
Так сам вьювер тут не при чем. Это база плохая.

Цитата Сообщение от HackerVlad Посмотреть сообщение
LenB то Len, а что правильно на самом деле? .cbSize = LenB(tClass) или .cbSize = Len(tClass)
Зависит от многих факторов. LenB возвращает размер с учетом выравниваний и юникода, Len так как бы структура писалась в файл стандартными средствами.
1
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
07.08.2023, 20:42  [ТС]
testuser2, в твоём примере если String из 8 символов, то он будет 16 байт занимать конечно же + 2 байта на Integer поэтому и 18 байт, я не понял чему ты там удивился
0
1401 / 860 / 92
Регистрация: 08.02.2017
Сообщений: 3,663
Записей в блоге: 2
08.08.2023, 02:00
Цитата Сообщение от The trick Посмотреть сообщение
LenB возвращает размер с учетом выравниваний и юникода
Все равно, для строки (bstr) ведь не весь размер возвращает, без первых без первых 4 бита и последних 2 нулевых
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
08.08.2023, 12:19  [ТС]
testuser2, кстати строка BSTR не всегда содержит на конце Null

Добавлено через 4 минуты
testuser2, BSTR даже лучше чем WideString из всех этих WinAPI, тут интересно очень почитал: http://www.freebasic.su/articles/bstr.htm

Добавлено через 10 минут
Цитата Сообщение от testuser2 Посмотреть сообщение
без первых 4 бита
может ты имел ввиду 4 байта, именно байта!!!

Добавлено через 1 минуту
32-битное целое число - это 4 байта. 4 байта это 32 бита.

Добавлено через 48 секунд
в BSTR строке используется первые 4 байта, а не бита, для определения длинны строки.

Добавлено через 2 минуты
Бит - это одна восьмая байта вообще-то. Не люблю когда люди путают эти понятия.
1
1401 / 860 / 92
Регистрация: 08.02.2017
Сообщений: 3,663
Записей в блоге: 2
08.08.2023, 17:58
Цитата Сообщение от HackerVlad Посмотреть сообщение
может ты имел ввиду 4 байта, именно байта!!!

Не по теме:

Да итеть мать их драченую, действительно байты! ))

0
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
08.08.2023, 19:05
Цитата Сообщение от testuser2 Посмотреть сообщение
Все равно, для строки (bstr) ведь не весь размер возвращает, без первых без первых 4 бита и последних 2 нулевых
Строки фиксированной длины в структурах - это просто массивы символов, без нулевых байтов и заголовков т.к. в них нет смысла в данном случае.

Цитата Сообщение от HackerVlad Посмотреть сообщение
testuser2, кстати строка BSTR не всегда содержит на конце Null
Всегда, только если конечно его специально не перезаписать.
1
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
08.08.2023, 19:32  [ТС]
Бит - это одна восьмая байта вообще-то. Не люблю когда люди путают эти понятия.
Цитата Сообщение от The trick Посмотреть сообщение
Всегда, только если конечно его специально не перезаписать.
Я когда работаю с API то часто отрезается vbNullChar на конце))) Ну я сам отрезаю может, но тем ни менее строка бывает без Null на конце довольно часто и VB прекрасно с этим работает!

Добавлено через 1 минуту
И вообще BSTR строки лучше тем, что они могут где угодно содержать vbNullChar а не только на конце

Добавлено через 19 минут
А почему InStr не находит vbNullChar в любой строке VB6?

Написал пробный код:

Visual Basic
1
2
3
4
5
6
7
8
9
10
Dim str As String
    Dim lNullPos As Long
    
    str = Space$(260)
    
    lNullPos = InStr(1, str, vbNullChar)
    
    If lNullPos Then
        MsgBox "founded!"
    End If
И ничего не находит! Почему не находит этот самый vbNullChar на конце строки, если он есть?

Добавлено через 2 минуты
А в VB6-строках точно есть на конце Null???
0
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
08.08.2023, 20:26
Цитата Сообщение от HackerVlad Посмотреть сообщение
А почему InStr не находит vbNullChar в любой строке VB6?
Потому что он находится за строкой.

Цитата Сообщение от HackerVlad Посмотреть сообщение
А в VB6-строках точно есть на конце Null???
https://learn.microsoft.com/en... tomat/bstr
1
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
09.08.2023, 02:33  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
Можно послать какое-либо сообщение WM_APP + xxx или заюзать RegisterWindowMessage
Скажи пожалуйста, а можно ли отправить это сообщение другой копии свой программы, ну то есть практически другому процессу, мне это нужно для того чтобы при запуске второй копии программы, вторая копия отсылала сообщение первой копии и первая копия активизировалась на экране. Но по всей видимости WM_APP + xxx работает только внутри одного своего приложения и всё? Неужели придётся использовать WM_COPYDATA?

Добавлено через 27 минут
А хотя вы знаете всё работает и всё посылается! Сообщение вполне посылается в другую копию своего процесса. Просто вместо Private Const WM_APP = &H8000 надо было написать Private Const WM_APP = &H8000&. Сивол & на конце. Вот и вся моя ошибка была (это довольно распространённая ошибка оказывается, умные люди тут подсказали уже https://www.vbforums.com/showt... eclaration)

Добавлено через 4 минуты
Сделал в итоге так:

Visual Basic
1
2
Private Const WM_APP = &H8000&
Private Const WM_ACTIVATE_ME As Long = (WM_APP + 16) ' Свою константу придумал из головы
Добавлено через 1 минуту
Я не могу использовать RegisterWindowMessage потому что вторая первая копия моей программы не будет знать то что во второй копии программы получилось с помощью RegisterWindowMessage

Добавлено через 43 секунды
Поэтому я придумал WM_APP + 16 в надежде что это сообщение будет всегда свободно (а куда оно денется у меня собственный класс)
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
09.08.2023, 12:55  [ТС]
The trick, у меня ещё появились вопросы к твоей очереди, у меня кнопку Tab вырубило вообще не работает на форме

Добавлено через 5 минут
The trick, при такой очереди по моей системе:

Visual Basic
1
2
3
4
5
Do
        WaitMessage
        
        DoEvents
    Loop
работают кнопки Tab и Enter

Добавлено через 1 минуту
The trick, но твоя очередь, которую ты так хвалил, приводит к катастрофе - вырубает кнопку Tab и Enter на форме

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
' Очередь
    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
    Loop
Этот код приводит к отрубанию Tab, почему?

Добавлено через 1 минуту
Я не понимаю зачем ты так нахваливал свою систему очереди если она работает хуже
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
09.08.2023, 12:59  [ТС]
The trick, посмотри пожалуйста вот проект прикладываю
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.08.2023, 12:59

Используя иерархию и наследование, создать классы окно, окно с заголовком и окно с кнопкой
Используя иерархию и наследование, создать классы окно, окно с заголовком и окно с кнопкой. 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...

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


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Контроль уникальности строк в табличной части документа
Maks 18.06.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ПланированиеСпецтехники" с табличной частью "НаличиеОборудования", разработанного в КА2. Задача: контроль уникальности строк в. . .
Клиент
Uhbif79 18.06.2026
Здесь простой клиент для работы с сервером.
Сервер
Uhbif79 18.06.2026
Выкладываю простейший сервер.
Дефенестрация
kumehtar 18.06.2026
Узнал интересное слово. Дефенестрация. Это когда ты выбрасываешь кого-либо или что-либо из окна. Возьму на вооружение)))
Дихотомия добра и зла
kumehtar 18.06.2026
Как Дзен-буддисты говорят о добре и зле: не нужно воевать против зла, нужно воевать против невежества. Тогда добро станет ествественным, и поэтому вечным. Но дело в том, что невежество всё время. . .
Своя Интернет-Компания
iceja 18.06.2026
Я программист с экономическим образованием, пишу свой проект, это SaaS для бизнесов. Мне нужен co-founder с высшим экономическим образованием, и/ или инвестор. Сейчас проект в интенсивной разработке,. . .
24 Мат модель здравосохранения: функциональные требования к строительству пищеблока
anaschu 18.06.2026
СРесурсами1: финансовый SD-контур, калькулятор функциональных требований пищеблока Сегодня разделили затраты в агенте Экономика по образцу модели НАСОСЫ, добавили расчёт ROI и построили первый. . .
23. что сделано за последнее время.
anaschu 17.06.2026
• Эталон: Клиника НИИ питания РАМН, Москва — централизованный пищеблок, 225 коек, 180 пациентов • Git: репозиторий med2, ветка абсентеизм. Рабочий файл: СРесурсами1_v4. alp • Смежный проект:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru