Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.85/20: Рейтинг темы: голосов - 20, средняя оценка - 4.85
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769

Как создать на VB6 уникодный InputBox? Чтобы при вводе в InputBox можно было получать китайские иероглифы и так далее

15.11.2023, 22:50. Показов 4770. Ответов 51

Студворк — интернет-сервис помощи студентам
Как создать на VB6 уникодный InputBox? Чтобы при вводе в InputBox можно было получать китайские иероглифы и так далее. Текстовое поле InputBox'а, что самое интересное и так позволяет вводить китайщину, но вот на выходе функции мы получаем уже знаки вопросов...

Добавлено через 54 минуты
Хотите чудо? InputBox создаётся с ANSI-окнами, и с ANSI текстовым полем, без стилизации окна манифестом...
Со стилизацией манифестом уже создаётся Unicode окна и уникодное текстовое поле ввода... Это очень странно и меня очень шокировало...

Добавлено через 15 минут
Таким образом, уникодный InputBox будет работать только если стилизовать программу, применить стили красивостей окон. В противном случае пришлось бы уничтожать старый Edit через DestroyWindow и поверх создавать новое текстовое поле через CreateWindowExW... Чтобы работало и без стилей...
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.11.2023, 22:50
Ответы с готовыми решениями:

Можно ли настроить Inputbox, чтобы не блокировалась книга и можно было изменять данные в ячейках?
Всем привет! Подскажите, можно ли настроить Inputbox так, чтобы не блокировалась книга и можно было изменять данные в ячейках? Спасибо!

как сделать чтоб при вводе в inputbox вводились толька символы 0.123456789
Вопрос такой как сделать чтоб при вводе в inputbox вводились толька символы 0.123456789 чтоб если ввести чтота другое то появлялось...

Обработать событие OnKeyPress при вводе целого числа в Edit так, чтобы можно было вставить только один знак минус
помогите решить) Обработать событие OnKeyPress при вводе целого числа в Edit так, чтобы можно было вставить только один знак минус в...

51
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
18.11.2023, 09:40  [ТС]
Студворк — интернет-сервис помощи студентам
К сожалению, я не знаю исходного кода функции InputBox, но можно самому легко догадаться, что она вызывает функцию DialogBoxParamA, которая создает модальное диалоговое окно из ресурса шаблона диалогового окна.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
18.11.2023, 10:12  [ТС]
Да, для вызова InputBox используется именно DialogBoxParam. Я сейчас проэксперементировал и реально смог вызвать это самое заветное диалоговое окно InputBox из ресурсов msvbvm60.dll. А это значит, что я на правильном пути понимания исходного кода функции InputBox.

Пример (модуль):
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
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
Option Explicit
 
Public Declare Function DialogBoxParam Lib "user32" Alias "DialogBoxParamA" (ByVal hInstance As Long, ByVal lpTemplate As Long, ByVal hWndParent As Long, ByVal lpDialogFunc As Long, ByVal dwInitParam As Long) As Long
Public Declare Function EndDialog Lib "user32" (ByVal hDlg As Long, ByVal nResult As Long) As Long
 
Public Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Public Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Public Declare Function GetDlgItem Lib "user32" (ByVal hDlg As Long, ByVal nIDDlgItem As Long) As Long
Public Declare Function GetDlgItemText Lib "user32" Alias "GetDlgItemTextA" (ByVal hDlg As Long, ByVal nIDDlgItem As Long, ByVal lpString As String, ByVal nMaxCount As Long) As Long
 
Public Const MB_OK = &H0&
Public Const MB_ICONINFORMATION = &H40&
 
Public Const CB_ADDSTRING = &H143
Public Const WM_INITDIALOG = &H110
Public Const WM_COMMAND = &H111
 
Public Const IDOK = 1
Public Const IDCANCEL = 2
Public Const BN_CLICKED = 0
 
'Функция обработки сообщений диалогового окна
Public Function DialogBoxProc(ByVal hwndDlg As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    If uMsg = WM_COMMAND Then
        
        If wParam = IDOK Or wParam = IDCANCEL Then
            EndDialog hwndDlg, 0
            DialogBoxProc = 1
            Exit Function
        End If
       
    End If
    
    If uMsg = WM_INITDIALOG Then
        
    End If
    
    DialogBoxProc = 0
End Function
 
Public Function ShowDialog(hParent As Long) As Boolean
    Dim hmsvbvm60 As Long
    
    hmsvbvm60 = LoadLibrary("msvbvm60.dll")
    
    If hmsvbvm60 <> 0 Then
        DialogBoxParam hmsvbvm60, 4031, hParent, AddressOf DialogBoxProc, 0 ' Тот самый заветный код, который вызывает InputBox
        
        FreeLibrary hmsvbvm60
    End If
End Function
Пример (форма):

Visual Basic
1
2
3
4
5
6
7
8
9
Option Explicit
 
Private Sub cmdShowDialog_Click()
    ShowDialog hwnd
End Sub
 
Private Sub Command1_Click()
    Me.Caption = InputBox("123")
End Sub
Вложения
Тип файла: zip DialogBoxParam.zip (2.7 Кб, 0 просмотров)
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
18.11.2023, 14:54  [ТС]
testuser2, как так получается, что у тебя инпутбокс мой не отображал китайщину, а у людей, говорят, VBA уже встроенный инпутбокс поддерживает уникод? Вот здесь говорят: InputBox с поддержкой юникода я специально тему там создал для опроса VBA'шников)
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
19.11.2023, 01:41  [ТС]
Ура!!! Наконец-таки, я создал новый модуль для вызова юникодного InputBox'а. Теперь InputBox вызывается по совершенно новой технологии, минуя саму функцию InputBox, вызывается всего одной строкой кода:

Visual Basic
1
DialogBoxParam msvbvm60, 4031, hParent, AddressOf DlgProc, StrPtr(strPrompt)
Это просто фантастика! Оказывается можно вызывать диалоговое окно напрямую из ресурсов msvbvm60.dll! Спасибо конечно The Trick'у за подсказки как двигаться в правильном направлении. Теперь, с уверенностью, могу сказать, что это уже никакие не "костыли"! Кстати говоря, на иностранном форуме, такие, примерно похожие "костыли", уже были написаны: https://www.vbforums.com/showt... ar-support
Но никто ещё, кроме меня, не написал это правильно через простую функцию DialogBoxParam. Надо будет иностранцам кстати тоже подогнать этот код, а то они там на форуме до сих пор обсуждают этот "костыль" через хуки и субклассирование. А мой юникодный InputBox работает даже без манифестов!!! Это значительный прорыв вообще. Я очень рад, что я это создал)))

Код нового модуля:
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
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
130
131
132
133
134
135
136
137
138
Option Explicit
'/////////////////////////////////////////////
'// Модуль для вызова юникодного InputBox'а //
'// Copyright (c) 19.11.2023 by HackerVlad  //
'// e-mail: vladislavpeshkov@yandex.ru      //
'// Версия 2.0                              //
'/////////////////////////////////////////////
 
Private Declare Function DialogBoxParam Lib "user32" Alias "DialogBoxParamW" (ByVal hInstance As Long, ByVal lpTemplate As Long, ByVal hWndParent As Long, ByVal lpDialogFunc As Long, ByVal dwInitParam As Long) As Long
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryW" (ByVal lpLibFileName As Long) As Long
Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
Private Declare Function EndDialog Lib "user32" (ByVal hDlg As Long, ByVal nResult As Long) As Long
Private Declare Function SendDlgItemMessage Lib "user32" Alias "SendDlgItemMessageW" (ByVal hDlg As Long, ByVal nIDDlgItem As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function SetDlgItemText Lib "user32" Alias "SetDlgItemTextW" (ByVal hDlg As Long, ByVal nIDDlgItem As Long, ByVal lpString As Long) As Long
Private Declare Function GetDlgItemText Lib "user32" Alias "GetDlgItemTextW" (ByVal hDlg As Long, ByVal nIDDlgItem As Long, ByVal lpString As Long, ByVal nMaxCount As Long) As Long
Private Declare Function GetDlgItem Lib "user32" (ByVal hDlg As Long, ByVal nIDDlgItem As Long) As Long
Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
Private Declare Function SetWindowText Lib "user32" Alias "SetWindowTextW" (ByVal hwnd As Long, ByVal lpString As Long) As Long
Private Declare Function MoveWindow Lib "user32" (ByVal hwnd As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal bRepaint As Long) As Long
Private Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long
Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal CX As Long, ByVal CY As Long, ByVal wFlags As Long) As Long
Private Declare Function GetMonitorInfo Lib "user32.dll" Alias "GetMonitorInfoA" (ByVal hMonitor As Long, ByRef lpmi As MONITORINFO) As Long
Private Declare Function MonitorFromWindow Lib "user32.dll" (ByVal hwnd As Long, ByVal dwFlags As Long) As Long
 
Private Const IDOK = 1
Private Const IDCANCEL = 2
Private Const ID_EDIT = 4900
Private Const ID_STATIC = 4901
Private Const ID_HELP = 4902
Private Const WM_COMMAND = &H111
Private Const WM_INITDIALOG = &H110
Private Const SW_HIDE = 0
Private Const SWP_NOSIZE = &H1
Private Const SWP_NOZORDER = &H4
Private Const MONITOR_DEFAULTTONEAREST = &H2
Private Const WM_GETTEXTLENGTH As Long = &HE
Private Const EM_SETSEL = &HB1
 
Private Type RECT
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
End Type
 
Public Type MONITORINFO
    cbSize As Long
    rcMonitor As RECT
    rcWork As RECT
    dwFlags As Long
End Type
 
Dim InputText As String
Dim TitleText As String
Dim DefaultText As String
Dim CenterOnWorkspace As Boolean ' Аналог DS_CENTER
 
' Вызвать InputBox из msvbvm60.dll с поддеркой юникода
Public Function InputBoxW(ByVal hParent As Long, ByVal strPrompt As String, Optional ByVal strTitle As String, Optional CenterOnMonitorWorkspace As Boolean, Optional ByVal strDefault As String) As String
    Dim msvbvm60 As Long
    
    msvbvm60 = LoadLibrary(StrPtr("msvbvm60.dll"))
    
    If msvbvm60 <> 0 Then
        TitleText = strTitle
        DefaultText = strDefault
        CenterOnWorkspace = CenterOnMonitorWorkspace
        DialogBoxParam msvbvm60, 4031, hParent, AddressOf DlgProc, StrPtr(strPrompt) ' Тот самый заветный код, который вызывает InputBox
    End If
    
    InputBoxW = InputText
    InputText = vbNullString
    TitleText = vbNullString
    DefaultText = vbNullString
End Function
 
' Функция обработки сообщений диалогового окна
Private Function DlgProc(ByVal hwndDlg As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Dim NotidyCode As Long
    Dim ItemID As Long
    Dim rct As RECT
    Dim hMonitor As Long
    Dim MI As MONITORINFO
    Dim TextLen As Long
    
    Select Case uMsg
        Case WM_INITDIALOG
            If Len(TitleText) = 0 Then TitleText = App.Title
            SetWindowText hwndDlg, StrPtr(TitleText)
            
            ShowWindow GetDlgItem(hwndDlg, ID_HELP), SW_HIDE
            SetDlgItemText hwndDlg, ID_STATIC, lParam
            
            ' Определяем размеры окна
            GetWindowRect hwndDlg, rct
            
            If CenterOnWorkspace = False Then ' Стандартная центровка
                SetWindowPos hwndDlg, 0, ((Screen.Width / Screen.TwipsPerPixelX) - (rct.Right - rct.Left)) / 2, (((Screen.Height / Screen.TwipsPerPixelY) - (rct.Bottom - rct.Top)) / 2) - (rct.Bottom - rct.Top), 0, 0, SWP_NOSIZE Or SWP_NOZORDER
            Else ' Центровка по рабочей области экрана (аналог стиля DS_CENTER)
                hMonitor = MonitorFromWindow(hwndDlg, MONITOR_DEFAULTTONEAREST)
                MI.cbSize = LenB(MI)
                
                If GetMonitorInfo(hMonitor, MI) <> 0 Then
                    SetWindowPos hwndDlg, 0, ((MI.rcWork.Right - MI.rcWork.Left) - (rct.Right - rct.Left)) / 2, ((MI.rcWork.Bottom - MI.rcWork.Top) - (rct.Bottom - rct.Top)) / 2, 0, 0, SWP_NOSIZE Or SWP_NOZORDER
                End If
            End If
            
            If Len(DefaultText) > 0 Then
                SetDlgItemText hwndDlg, ID_EDIT, StrPtr(DefaultText)
                SendDlgItemMessage hwndDlg, ID_EDIT, EM_SETSEL, 0, -1
            End If
            
            DlgProc = 1
            Exit Function
        
        Case WM_COMMAND
            NotidyCode = wParam \ 65536
            ItemID = wParam And 65535
            
            If ItemID = IDOK Then
                TextLen = SendDlgItemMessage(hwndDlg, ID_EDIT, WM_GETTEXTLENGTH, 0, 0)
                InputText = Space$(TextLen)
                GetDlgItemText hwndDlg, ID_EDIT, StrPtr(InputText), TextLen + 1
                
                EndDialog hwndDlg, 0
                DlgProc = 1
                Exit Function
            End If
            
            If ItemID = IDCANCEL Then
                EndDialog hwndDlg, 0
                DlgProc = 1
                Exit Function
            End If
    End Select
    
    DlgProc = 0
End Function
Код формы:
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
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
Option Explicit
Private Declare Function DefWindowProcW Lib "user32" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Const WM_SETTEXT = &HC
 
Private Sub Command1_Click()
    Dim str As String
    
    str = InputBoxW(0, "Китайский язык приветствуется. " & vbNewLine & "Введите китайщину (например " & ChrW(&H4EBA) & "):", "Дружба народов " & ChrW(-29686), True, "Это китайский символ дружбы - " & ChrW(-29686))
    
    If Len(str) > 0 Then
        DefWindowProcW Me.hwnd, WM_SETTEXT, 0, ByVal StrPtr(Chr(34) & str & Chr(34))
    Else
        Me.Caption = "Canceled."
    End If
End Sub
 
Private Sub Command2_Click()
    Dim str As String
    
    str = InputBoxW(hwnd, "Китайский язык приветствуется. " & vbNewLine & "Введите китайщину (например " & ChrW(-29686) & "):")
    
    If Len(str) > 0 Then
        DefWindowProcW Me.hwnd, WM_SETTEXT, 0, ByVal StrPtr(Chr(34) & str & Chr(34))
    Else
        Me.Caption = "Canceled."
    End If
End Sub
 
Private Sub Command3_Click()
    Dim str As String
    
    str = InputBoxW(hwnd, "Китайский язык приветствуется. " & vbNewLine & "Введите китайщину (например " & ChrW(&H4EBA) & "):", "Дружба народов " & ChrW(-29686), True, "Это китайский символ дружбы - " & ChrW(-29686))
    
    If Len(str) > 0 Then
        DefWindowProcW Me.hwnd, WM_SETTEXT, 0, ByVal StrPtr(Chr(34) & str & Chr(34))
    Else
        Me.Caption = "Canceled."
    End If
End Sub
 
Private Sub Command4_Click()
    Dim str As String
    
    str = InputBoxW(hwnd, "Китайский язык приветствуется. " & vbNewLine & "Введите китайщину (например " & ChrW(&H4EBA) & "):", "Дружба народов " & ChrW(-29686), False, "Это китайский символ дружбы - " & ChrW(-29686))
    
    If Len(str) > 0 Then
        DefWindowProcW Me.hwnd, WM_SETTEXT, 0, ByVal StrPtr(Chr(34) & str & Chr(34))
    Else
        Me.Caption = "Canceled."
    End If
End Sub
И сам проект прилагается в ZIP-архиве конечно же :-)
Миниатюры
Как создать на VB6 уникодный InputBox? Чтобы при вводе в InputBox можно было получать китайские иероглифы и так далее  
Вложения
Тип файла: zip Юникодный InputBox 2.0.zip (9.8 Кб, 0 просмотров)
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
19.11.2023, 02:53  [ТС]
Всё ещё проще, оказывается, есть скрипт через CreateObject прочитал на иностранном форуме, но диалог вызывается не модальным:

Visual Basic
1
2
3
4
5
6
7
8
9
Public Function InputBoxW(Prompt, Title, Default) As String
Dim sc
Dim s
Set sc = CreateObject("msscriptcontrol.scriptcontrol")
sc.language = "vbscript"
s = sc.Eval("InputBox(""" & Prompt & """,""" & Title & """,""" & Default & """)")
If IsEmpty(s) Then s = vbNullString Else If Len(s) = 0 Then s = ""
InputBoxW = s
End Function
0
1386 / 842 / 91
Регистрация: 08.02.2017
Сообщений: 3,588
Записей в блоге: 1
19.11.2023, 05:57
Цитата Сообщение от HackerVlad Посмотреть сообщение
"msscriptcontrol.scriptcontrol"
Интересная штука, вот есть тема по ней. В vba не работает почему-то даже на раннем связывании. Ошибка на строке sc.Language = "VBScript", а в VB все работает нормально, проверил. Тот самый случай, когда vba не может чего-то что vb6..

Добавлено через 1 минуту
Ошибка
Code
1
2
Run-time error '380':
A script engine for the specified language can not be created.
Добавлено через 4 минуты
А вот "JScript" подхватывает "на ура"
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
19.11.2023, 13:05  [ТС]
testuser2, попробуй этот новый код (уже теперь модальный InputBox):

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
Public Function InputBoxW(Prompt, title, Optional Default = "") As String
Dim sc
Dim s
Dim p As String
Dim v As String
Set sc = CreateObject("MSScriptControl.ScriptControl")
sc.Language = "VBScript"
p = Prompt: GoSub jConcat
p = title: GoSub jConcat
p = Default: GoSub jConcat
If ObjPtr(Screen.ActiveForm) Then sc.SitehWnd = Screen.ActiveForm.hWnd
s = sc.Eval("InputBox(" & v & ")")
If IsEmpty(s) Then s = vbNullString Else If Len(s) = 0 Then s = ""
 
InputBoxW = s
Exit Function
 
jConcat:
If v <> "" Then v = v & ","
If InStr(1, p, """") Then p = Replace(p, """", """""")
If InStr(1, p, vbCrLf) Then p = Replace(p, vbCrLf, """ & vbNewLine & """)
If InStr(1, p, vbLf) Then p = Replace(p, vbLf, """ & vbNewLine & """)
v = v & ("""" & p & """")
Return
End Function
Добавлено через 3 минуты
Надо кстати ещё проверить, будет ли этот код работать в Xp...
0
1386 / 842 / 91
Регистрация: 08.02.2017
Сообщений: 3,588
Записей в блоге: 1
19.11.2023, 13:45
Я писал выше у меня это не работает в vba
Цитата Сообщение от HackerVlad Посмотреть сообщение
Set sc = CreateObject("MSScriptControl.ScriptCont rol")
sc.Language = "VBScript"
Зачем проверять то, что заведомо известно, что не работает
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
19.11.2023, 13:47  [ТС]
testuser2, тогда мой модуль на API будет весьма кстати для VBA
0
1386 / 842 / 91
Регистрация: 08.02.2017
Сообщений: 3,588
Записей в блоге: 1
19.11.2023, 14:06
HackerVlad, на vba же есть Application.InputBox. Вот со скрипт-контролом, я что-то не пойму. Я помню, как-то видел у Catstail'а была интересная статья на Хабре, сейчас нашел ее и там как раз-таки, речь идет про VBA и MSScriptControl, то беж у него работает. Проверю сейчас на x64 vba..

Добавлено через 8 минут
На x64 также не работает, на раннем связывании в том числе
Code
1
ActiveX component can’t create object
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
19.11.2023, 14:48  [ТС]
testuser2, ну и хрен с ним...

Добавлено через 43 секунды
это уже отдельная тема почему в VBA не работает "MSScriptControl.ScriptControl"
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
29.11.2023, 11:06  [ТС]
Оказывается тема продолжается, так как ВанГогИгрок меня озадачил своим новым кодом, посмотрите вот: https://www.vbforums.com/showt... ost5624133
Он изучил мой код и написал какой-то новый код с использованием некого трамплина. Я если честно удивлён его новому решению.

Добавлено через 1 минуту
Как я понял он решил перехватывать функцию DialogBoxParamA

Добавлено через 2 минуты
Скоро придётся писать третью версию модуля, чувствую...

Добавлено через 6 минут
Неужели можно в любом месте кода просто писать InputBox вызывать родной InputBox и перехватывать функцию DialogBoxParamA какими-то трамплинами и обрабатывать... Для уникодности...

Добавлено через 1 час 54 минуты
ВанГогИгрок не учёл самого главного: его код не работает без манифеста, поэтому не буду я пользоваться его кодом. Он перехватывает функцию DialogBoxParamA и перенаправляет на свою оконную процедуру диалогового окна, с помощью ассемблерной вставки по моему, но это не важно, важно, что его код не работает без манифестов. Поэтому какие бы он там трамплины не использовал его код всё равно хуже, а он мне ответил, что это не соревнование аххахахаха

Добавлено через 12 секунд
Но зато третью версию мне писать не надо)))
1
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
29.11.2023, 19:02  [ТС]
Я указал ему на ошибку, Вангогу, и он исправил её. Теперь у него и без манифестов юникод работает. Хм, а ведь у него совсем другой алгоритм. Он перехватывает функцию DialogBoxParamA через хук и перенаправляет уже на DialogBoxParamW функцию. Я никогда раньше не работал с хуками перехвата функций, поэтому это интересно.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
03.12.2023, 23:34  [ТС]
Помогите, пожалуйста, разобраться с тем как именно код майкрософта "центрирует" инпутбокс на экране. Если это можно назвать центровкой конечно, он выше центра располагается окно диалоговое. Вот я прилагаю свои наброски, с использованием трамплина хука перехвата АПИ-функции.
Вложения
Тип файла: zip Юникодный InputBox 3.0.zip (9.6 Кб, 6 просмотров)
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
03.12.2023, 23:55  [ТС]
Чего я хочу? Я хочу вскрыть исходный код майкрософта, именно функции обратного вызова DlgProc, именно в секции WM_INITDIALOG, с целью, чтобы узнать как именно майкрософт "центрирует" это окно. Ведь положение окна на экране получается не ровно по центру, а чуть выше чем по центру, именно эту формулу мне никак не удалось ещё раскрыть.

Добавлено через 50 секунд
Я и так написал всё почти правильно, почти как в майкрософте написали когда-то. Но не имея исходников майкрософта самому догадываться до этого всего очень-очень сложно.

Добавлено через 4 минуты
Просто я не хочу как ВанГогИгрок использовать трамплины эти и перенаправления на майкрософтовский код а потом его второй же раз изменять... У него сначала задаётся например текст окна и надписей в оригинальной функции обратного вызова майкрософтовским кодом в WM_INITDIALOG а потом он переписывает своим кодом в WM_SHOWWINDOW в результате текст надписей задаётся целых два раз - это неправильный подход. Правильный подход как у меня изначально во второй версии модуля, сразу исходный код инпутбокса без вызова майкрософтовского кода вообще. Ну конечно если вызывать майкрософтовский код именно то тогда центровка будет как надо... Но я не хочу это делать как делает ВанГогИгрок с vbforums.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
29.01.2024, 12:52  [ТС]
Цитата Сообщение от HackerVlad Посмотреть сообщение
Помогите, пожалуйста, разобраться с тем как именно код майкрософта "центрирует" инпутбокс на экране.
Неужели никто не знает

Помогите!!!
Цитата Сообщение от HackerVlad Посмотреть сообщение
Я хочу вскрыть исходный код майкрософта, именно функции обратного вызова DlgProc
0
sleep
 Аватар для I can
4931 / 4593 / 840
Регистрация: 13.04.2015
Сообщений: 9,753
29.01.2024, 13:18
HackerVlad, переходи на Net



З.Ы. А ты динозавров застал?
0
Эксперт по электронике
6583 / 3210 / 335
Регистрация: 28.10.2011
Сообщений: 12,537
Записей в блоге: 7
29.01.2024, 13:52
Когда разрабатывали VB6, это было время Windows 98 и юникод в ОС не был распространен. Он появился позже.
Как написали выше, переходите на современные ЯП.
Вот например PB.
Миниатюры
Как создать на VB6 уникодный InputBox? Чтобы при вводе в InputBox можно было получать китайские иероглифы и так далее  
1
1386 / 842 / 91
Регистрация: 08.02.2017
Сообщений: 3,588
Записей в блоге: 1
29.01.2024, 14:44
Цитата Сообщение от HackerVlad Посмотреть сообщение
Помогите, пожалуйста, разобраться с тем как именно код майкрософта "центрирует" инпутбокс на экране.
Цитата Сообщение от HackerVlad Посмотреть сообщение
Visual Basic
1
2
' Устанавливаем хук на создание окон в системе
 hEvent = SetWinEventHook(EVENT_OBJECT_SHOW, EVENT_OBJECT_SHOW, 0, AddressOf WinEventProc, 0, App.ThreadID, 0)
Не знаю на счет такого хука, но если хукать с помощью SetWindowHookEx с флагом WH_CBT перед созданием окна происходит два события HCBT_CREATEWND и HCBT_ACTIVATE. Когда HCBT_CREATEWND на lParam прихдит указатель на структуру CBT_CREATEWND в которой указатель на структуру CREATESTRUCT и если в ней записать свои x и y то типа можно выставить положение окна (судя из описания) до его появления.
1
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
30.01.2024, 01:04  [ТС]
Советы не программировать на VB6 меня не устраивают, а вот тебе testuser2 спасибо, но как-то это всё замудрёно ты написал конечно :-)

Добавлено через 1 минуту
В этой теме у меня уже есть на самом деле много ответов как вызвать InputBox с поддержкой юникода. Просто я не всё до конца смог доработать. Хук с помощью SetWinEventHook штука хорошая конечно, но от этого хука, я помню, я уже отказался. Так как я нашёл способ самому вызывать диалоговое окно InputBox и я уже говорил об этом.

Добавлено через 1 минуту
Я лишь не нашёл того самого кода, который каким-то образом, центрирует инпутбокс не в самом центре экрана, а как бы чуть выше центра. Я не разгадал эту формулу ещё.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.01.2024, 01:04
Помогаю со студенческими работами здесь

Как сделать так, чтобы при вводе в консоле не было перехода на новую строку?
Допустим у меня есть: #include&lt;iostream&gt; using namespace std; int main() { int a; cout &lt;&lt; &quot;Введите значение:...

Можно ли так сделать так,чтобы предыдущего окно закрывалось при нажатие кнопки далее
from tkinter import * from tkinter import messagebox from tkinter import filedialog def on_closing(): if...

Как создать массив строк, чтобы их можно было как возвращать, так и изменять?
Здравствуйте. У меня следующая проблема: Вот так записан массив переменных string класса: public static string Sharpness { ...

Создать класс из процедуры так, чтобы в нём при вызове можно было менять направление отсчёта счётчика цикла
Могу-ли я создать класс из процедуры так, чтобы в нём при вызове можно было менять направление отсчёта счётчика цикла, и некоторые формулы...

Как создать файл DLL так, чтобы его можно было подключить к VBA Excel?
Пытаясь научиться подключать к VBA хотя бы самую тривиальную функцию на C++. Для примера написал на C++ простую функцию Kvadrat и...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
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, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru