Форум программистов, компьютерный форум, киберфорум
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.67/103: Рейтинг темы: голосов - 103, средняя оценка - 4.67
33 / 6 / 0
Регистрация: 18.05.2014
Сообщений: 127

Диалоговое окно выбора папки

24.05.2015, 21:48. Показов 23778. Ответов 73
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер!

Подскажите, пожалуйста, как открыть вот такое окно через cmd?
Ищу способы именно через сторонние программы, не скрипты JS и VBS.
Миниатюры
Диалоговое окно выбора папки  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.05.2015, 21:48
Ответы с готовыми решениями:

Как через командную строку открыть диалоговое окно "Свойства" для файла или папки?
Здравствуйте, подскажите как через командную строку открыть диалоговое окно "Свойства" для файла или папки(как на скриншоте)....

Организовать ввод текста. По нажатию Enter показать диалоговое окно с введенным текстом
помогите.плиз Организовать ввод текста. По нажатию Enter показать диалоговое окно с введенным текстом

Как скрыть дополнительно диалоговое окно в бат файле при работе с bitsadmin
Необходимо раскатить ПО через Bitsadmin, на Пк запускаю скачивание через в планировщике в котором выполняется скрипт скрывающий работу бат...

73
Эксперт Python
5439 / 3860 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
24.08.2015, 15:00
Студворк — интернет-сервис помощи студентам
Диалоговое окно вытягивается по ширине cmd. Мне кажется не правильно изменять размер окна.
lorents
По высоте вы имели ввиду?
Сделал такое поведение думая, что именно такое центрирование вам и нужно. Изначально было центрирование только по оси X.
Но это легко убирается.
Строка 369: heightDialog = rcWindowCon.Bottom - rcWindowCon.Top; //heightDialogDef;
заменить значение на то, что закомментировано, то есть должно быть так: heightDialog =heightDialogDef;
Заново скомпилировать код в батнике.
-------------------------
Как я понимаю для проекта .NET нужна в обязательном порядке, и без этого никак?
Ну C# без NET как бы не работает... Но 2.0 есть даже на XP (ну или почти на всех XP, потому что с 2007 года, когда вышел SP 3 для XP, NET 2.0 уже существовал 2 года и большинство таки должно было обновиться.).
1
33 / 6 / 0
Регистрация: 18.05.2014
Сообщений: 127
25.08.2015, 01:57  [ТС]
Garry Galler. Благодарю Вас!
А можно ли сделать так, чтобы диалоговое окно также открывалось по середине не только по ширина окна cmd, но и по высоте тоже.

Такое ощущение что FolderDialog игнорирует размер диалогвого окна который бл у пользователя и выставляет свое.
Миниатюры
Диалоговое окно выбора папки  
0
Эксперт Python
5439 / 3860 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
25.08.2015, 14:17
lorents
Сделал центрирование как у вас на скрине.
----------------------------------------------------
Что касается игнорирования последних размеров, которые пользователь задал расширив\сузив диалог вручную, то обратил внимание на это только сейчас. Почему так происходит пока не разобрался. Программа, если размеры явно не заданы в опциях, их никак не меняет - перед перемещением она получает объект прямоугольника диалога из которого высчитываются дефолтные размеры (они всегда получаются как 334x326)
Code
1
2
int widthDialogDef = rcWindowDialog.Right - rcWindowDialog.Left;
int heightDialogDef = rcWindowDialog.Bottom - rcWindowDialog.Top;
и эти размеры передаются в функцию SetWindowPos.
Возможно, игнорирование тут получается потому, что в обычном порядке система сначала выводит диалог с жестко заданными размерами 334x326 (и координатами по центру экрана), а затем меняет (это происходит незаметно визуально) на размеры последнего пользовательского использования, которые берет из реестра. А у меня - так как программа перехватывает у системы функцию задания размеров\координат - используются именно дефолтные\первоначальные системные размеры. Пользовательские же размеры получается нужно каждый раз читать из реестра.
Если это имеет значение - то можно попробовать отыскать куда система пишет эти размеры.
1
33 / 6 / 0
Регистрация: 18.05.2014
Сообщений: 127
25.08.2015, 16:09  [ТС]
Garry Galler, если решить данную проблему, то будет отлично.
0
4340 / 2130 / 661
Регистрация: 26.04.2015
Сообщений: 6,823
25.08.2015, 16:42
lorents, Но в самой утилите разве нет центрирования: 25/08/2015
*** Выпущена новая версия программы: FolderDialog v1.0.0.4.
* Исправлена возможность падения программы при некорректно заданных параметрах размера и координат.
* Изменено центрирование диалога относительно окна cmd.
* Изменены проверки валидности заданных координат и размеров диалога.
0
Эксперт Python
5439 / 3860 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
25.08.2015, 16:45
lorents
Если решать простым путем, то достаточно выставить в Thread.Sleep(70) паузу не меньше 70 мск, вместо 10 мск, чтобы система успела отрисовать окно с последними пользовательскими размерами. Моя программа в этом случае захватит эти новые размеры и окно переместится\отцентрируется с размерами именно последнего использования, а не дефолтными.
0
4340 / 2130 / 661
Регистрация: 26.04.2015
Сообщений: 6,823
25.08.2015, 16:45
Насколько понятно из справки: FolderDialog /o
0
Эксперт Python
5439 / 3860 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
25.08.2015, 16:47
alpap
lorents имел ввиду неотрабатывание программой пользовательских размеров окна (когда мы вручную тянем за край и меняем размеры окна), которые запоминаются ОС в реестре. Система их применяет налету - сразу после запуска диалога.
0
4340 / 2130 / 661
Регистрация: 26.04.2015
Сообщений: 6,823
25.08.2015, 16:53
Garry Galler, А это, практически, во всех утилитах и поменять это... даже лучше не браться.
0
Эксперт Python
5439 / 3860 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
25.08.2015, 17:14
alpap
Не во всех. DlgMsgBox тоже перемещает окно по X координате относительно cmd и размеры последнего использования диалога сохранятся, но там применяется специальный callback (функция обратного вызова), которая получает размеры окна уже после того как система его перерисует в соответствии с сохраненными в реестре.
У меня же прога слишком быстро перехватывает управление диалогом. И система не успевает применить параметры из реестра. Поэтому тут три варианта:
1) читать параметры из реестра (пока не ясно откуда именно)
2) увеличить паузу поиска окна в диапазоне 70-100 мск (лучше 100)
3) тоже использовать системный callback ( в C# коде с этим несколько сложнее, чем в скриптах использующих WinAPI )
0
33 / 6 / 0
Регистрация: 18.05.2014
Сообщений: 127
25.08.2015, 18:29  [ТС]
Именно поэтому я долгое время и работал с DlgMsgBox, но сейчас он не работает с Windows 10, а это критично.
0
⁞ ★☭ Mad Max ☭★ ⁞
279 / 84 / 12
Регистрация: 04.09.2013
Сообщений: 187
25.08.2015, 21:54
Цитата Сообщение от lorents Посмотреть сообщение
, но сейчас он не работает с Windows 10, а это критично

Не по теме:

Шурик, вы комсомолец?
- Да.
Это же не наш метод!



Костыль, добавляет совместимость с Win7 для DlgMsgBox.exe

Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
set "DlgMsgBoxexe=full_path_to_DlgMsgBox.exe"
call:addFFCompatRegKey && (echo+ Regkey added) || (echo+ Error adding regkey)
::-----
::-----
::-On exit:
call:delFFCompatRegKey
exit
 
:addFFCompatRegKey
set "WIN7RTM=~ WIN7RTM"
if not exist "%DlgMsgBoxexe%" (exit /b 1)
reg add "HKCU\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" /v "%DlgMsgBoxexe%" /t REG_SZ /d "%WIN7RTM%" /f >nul 2>&1
exit /b %errorlevel%
 
:delFFCompatRegKey
reg delete "HKCU\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" /v "%DlgMsgBoxexe%" /f >nul 2>&1
exit /b %errorlevel%
0
33 / 6 / 0
Регистрация: 18.05.2014
Сообщений: 127
25.08.2015, 22:22  [ТС]
Цитата Сообщение от @Root Посмотреть сообщение
Костыль, добавляет совместимость с Win7 для DlgMsgBox.exe
Windows 10?

не подскажите, куда надо вставлять код?
0
⁞ ★☭ Mad Max ☭★ ⁞
279 / 84 / 12
Регистрация: 04.09.2013
Сообщений: 187
25.08.2015, 23:00
Первые две строки в начало, в иниты, шестую и седьмую в процедуру выхода, остальные не важно куда, это процедуры.
Была у меня прога, крашилась и под семеркой и под восьмеркой, добавил параметр совместимости, стала работать без проблем
0
33 / 6 / 0
Регистрация: 18.05.2014
Сообщений: 127
26.08.2015, 00:06  [ТС]
Сделал так, но что-то не работает
Windows Batch file
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
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
#NoTrayIcon
 
set "DlgMsgBoxexe=full_path_to_DlgMsgBox.exe"
call:addFFCompatRegKey && (echo+ Regkey added) || (echo+ Error adding regkey)
 
Opt('MustDeclareVars', 1)
Opt('WinWaitDelay', 0)
Opt('WinTitleMatchMode', 2)
 
call:delFFCompatRegKey
exit
 
Global $iNo_Encoding, $sWhatDo, $sTitleBox, $sTextBox, $sFlagMsg, $iTimeMsg, $hWinCMD, _
        $aPosCMD, $iNoErrorCMD, $iOption
 
If $CmdLine[0] And StringInStr($CmdLine[1], 'help') Then
    If Not FileInstall('Help.txt', @TempDir & '\Help.txt', 1) Then Exit 100
    ShellExecuteWait(@TempDir & '\Help.txt')
    FileDelete(@TempDir & '\Help.txt')
    Exit
EndIf
If $CmdLine[0] < 3 Then _ConsoleWrite(-1)
For $i = 1 To 3
    If StringIsSpace($CmdLine[$i]) Then _ConsoleWrite(-1)
Next
 
$sWhatDo = $CmdLine[1]
$iNo_Encoding = Int(StringLeft($sWhatDo, 1))
If $iNo_Encoding Then $sWhatDo = StringTrimLeft($sWhatDo, 1)
$iOption = Int(StringRight($sWhatDo, 1))
If Not $iOption Or $iOption > 3 Then $iOption = 2
$sWhatDo = StringTrimRight($sWhatDo, 1)
$sTitleBox = $CmdLine[2]
$sTextBox = $CmdLine[3]
_CMD_Info($hWinCMD, $aPosCMD, $iNoErrorCMD)
Switch $sWhatDo
    Case 'Folder'
        _FolderDlg()
    Case 'File'
        _FileDlg()
    Case 'Msg'
        _MsgBox()
    Case Else
        _ConsoleWrite(-1)
EndSwitch
 
#region Func
Func _MsgBox()
    Local $i_Flag = 0, $i_Return, $i_TimeOut = 0, $s_Text, $a_Temp
    Switch $CmdLine[0]
        Case 4
            _GetFlagMsg($i_Flag)
        Case 5
            _GetFlagMsg($i_Flag)
            $i_TimeOut = Abs(Int($CmdLine[5]))
    EndSwitch
    If StringInStr($sTextBox, '|') Then
        $a_Temp = StringSplit($sTextBox, '|')
        For $i = 1 To $a_Temp[0]
            $s_Text &= $a_Temp[$i] & @CRLF
        Next
        $s_Text = StringTrimRight($s_Text, 2)
    Else
        $s_Text = $sTextBox
    EndIf
    If $iNoErrorCMD Then
        _ExecuteScript(3)
        Sleep(500)
    EndIf
    $i_Return = MsgBox($i_Flag, $sTitleBox, $s_Text, $i_TimeOut, $hWinCMD)
    If $i_Return Then
        _ConsoleWrite(0, $i_Return)
    Else
        _ConsoleWrite(3)
    EndIf
EndFunc   ;==>_MsgBox
 
Func _GetFlagMsg(ByRef $i_Flag)
    Local $s_Ico = StringLeft($CmdLine[4], 1), $i_Button = Int(StringRight($CmdLine[4], 1))
    If $i_Button > 6 Then $i_Button = 0
    Switch $s_Ico
        Case 'S'
            $i_Flag += 16
        Case 'Q'
            $i_Flag += 32
        Case 'E'
            $i_Flag += 48
        Case 'I'
            $i_Flag += 64
    EndSwitch
    Switch $iOption
        Case 2
            $i_Flag += 256
        Case 3
            $i_Flag += 512
    EndSwitch
    $i_Flag += $i_Button
EndFunc   ;==>_GetFlagMsg
 
Func _FileDlg()
    Local $s_Path, $a_Temp, $s_InitDir = @DesktopDir & '\'
    If $iNoErrorCMD Then
        _ExecuteScript(2)
        Sleep(200)
    EndIf
    If $iOption = 1 Then $s_InitDir = @MyDocumentsDir & '\'
    $s_Path = FileOpenDialog($sTitleBox, $s_InitDir, $sTextBox, 5, '', $hWinCMD)
    If @error Or Not $s_Path Then _ConsoleWrite(2)
    If StringInStr($s_Path, '|') Then
        $a_Temp = StringSplit($s_Path, '|')
        $s_Path = ''
        For $i = 2 To $a_Temp[0]
            $s_Path &= '"' & $a_Temp[1] & '\' & $a_Temp[$i] & '"' & @CRLF
        Next
        $s_Path = StringTrimRight($s_Path, 2)
    Else
        $s_Path = '"' & $s_Path & '"'
    EndIf
    _ConsoleWrite(0, $s_Path)
EndFunc   ;==>_FileDlg
 
Func _FolderDlg()
    ;From APIConstants.au3
    Local Const $_BIF_NEWDIALOGSTYLE = 0x00000040
    Local Const $_BIF_RETURNONLYFSDIRS = 0x00000001
    Local Const $_BIF_EDITBOX = 0x00000010
    Local Const $_BIF_VALIDATE = 0x00000020
 
    Local $i_Flag = BitOR($_BIF_NEWDIALOGSTYLE, $_BIF_RETURNONLYFSDIRS, $_BIF_EDITBOX, $_BIF_VALIDATE), _
            $s_Path, $h_BrowseProc, $p_BrowseProc
    If $iOption <> 2 Then
        If $iNoErrorCMD Then
            _ExecuteScript(1)
            Sleep(200)
        EndIf
    EndIf
    $h_BrowseProc = DllCallbackRegister('_BrowseProc', 'int', 'hwnd;uint;long;ptr')
    $p_BrowseProc = DllCallbackGetPtr($h_BrowseProc)
    $s_Path = _WinAPI_BrowseForFolderDlg(@DesktopDir, $sTextBox, $i_Flag, $p_BrowseProc, '', $hWinCMD)
    DllCallbackFree($h_BrowseProc)
    If Not StringInStr(FileGetAttrib($s_Path), 'd') Then _ConsoleWrite(1)
    _ConsoleWrite(0, '"' & $s_Path & '"')
EndFunc   ;==>_FolderDlg
 
Func _BrowseProc($h_Wnd, $i_Msg, $w_Param, $l_Param)
    ;From APIConstants.au3
    Local Const $_BFFM_INITIALIZED = 1
    Local $i_X, $i_Y, $h_Button
    If $i_Msg = $_BFFM_INITIALIZED Then
        WinSetTitle($h_Wnd, '', $sTitleBox)
        _CalculateMove($i_X, $i_Y, $h_Wnd)
        If Not @error Then
            WinMove($h_Wnd, '', $i_X, $i_Y)
        EndIf
    EndIf
    Return 0
EndFunc   ;==>_BrowseProc
 
Func _CMD_Info(ByRef $hWinCMD, ByRef $aPosCMD, ByRef $iNoErrorCMD)
    Local $s_TitleCMD = '[Class:ConsoleWindowClass]', $a_ListCMD, $i_PID_CMD
    $i_PID_CMD = _WinAPI_GetParentProcess()
    If @error Then
        $iNoErrorCMD = 0
        Return
    EndIf
    $a_ListCMD = WinList($s_TitleCMD)
    If Not IsArray($a_ListCMD) Or Not $a_ListCMD[0][0] Then
        $iNoErrorCMD = 0
        Return
    EndIf
    For $i = 1 To $a_ListCMD[0][0]
        If WinGetProcess($a_ListCMD[$i][1]) = $i_PID_CMD Then
            $hWinCMD = $a_ListCMD[$i][1]
            ExitLoop
        EndIf
    Next
    If $hWinCMD Then
        $iNoErrorCMD = 1
        $aPosCMD = WinGetPos($hWinCMD)
        If @error Or UBound($aPosCMD) <> 4 Then
            $iNoErrorCMD = 0
        Else
            $iNoErrorCMD = 1
        EndIf
    Else
        $iNoErrorCMD = 0
    EndIf
EndFunc   ;==>_CMD_Info
 
Func _ExecuteScript($i_Index)
    Local $s_TempFile, $h_File
    Local $s_ScriptText = "#NoTrayIcon" & @CRLF & "Opt('WinWaitDelay',0)" & @CRLF & _
            "Opt('WinTitleMatchMode',2)" & @CRLF & "$hWinCMD=HWnd(" & $hWinCMD & ")" & @CRLF & _
            "If Not $hWinCMD Then Exit" & @CRLF & "$h_Win=WinWait('[Title:" & $sTitleBox & ";Class:#32770]','',5)" & @CRLF & _
            "If Not $h_Win Then Exit" & @CRLF & "$h_Win=0" & @CRLF & "For $j=1 To 250" & @CRLF & _
            "$a_List=WinList('[Title:" & $sTitleBox & ";Class:#32770]')" & @CRLF & _
            "If Not IsArray($a_List) Or Not $a_List[0][0] Then ExitLoop" & @CRLF & _
            "For $i=1 To $a_List[0][0]" & @CRLF & "If _WinAPI_GetParent($a_List[$i][1])=$hWinCMD Then" & @CRLF & _
            "$h_Win=$a_List[$i][1]" & @CRLF & "ExitLoop 2" & @CRLF & "EndIf" & @CRLF & _
            "Next" & @CRLF & "Sleep(2)" & @CRLF & "Next" & @CRLF & "If Not $h_Win Then Exit" & @CRLF
    Switch $i_Index
        Case 1
            $s_ScriptText &= "$h_Button=ControlGetHandle($h_Win,'','[CLASS:Button;INSTANCE:" & $iOption & "]')" & @CRLF & _
                    "If Not $h_Button Then Exit" & @CRLF & "ControlFocus($h_Win,'',$h_Button)" & @CRLF & _
                    "DllCall('user32.dll','none','SendMessageW','hwnd',$h_Button,'uint',0xF4,'wparam',0x0001,'lparam',True)" & @CRLF & _
                    "DllCall('user32.dll','none','UpdateWindow','hwnd',$h_Button)" & @CRLF & "Exit"
        Case 2
            $s_ScriptText &= "$a_PosWin=WinGetPos($h_Win)" & @CRLF & "If @error Or UBound($a_PosWin)<>4 Then Exit" & @CRLF & _
                    "WinMove($h_Win,''," & $aPosCMD[0] & "+(" & $aPosCMD[2] & "-$a_PosWin[2])/2," & $aPosCMD[1] & ")" & @CRLF & "Exit"
        Case 3
            $s_ScriptText &= "WinSetState($h_Win,'',@SW_HIDE)" & @CRLF & "$a_PosWin=WinGetPos($h_Win)" & @CRLF & _
                    "If @error Or UBound($a_PosWin)<>4 Then" & @CRLF & "WinSetState($h_Win,'',@SW_SHOW)" & @CRLF & "Exit" & @CRLF & _
                    "EndIf" & @CRLF & "WinMove($h_Win,''," & $aPosCMD[0] & "+(" & $aPosCMD[2] & "-$a_PosWin[2])/2," & _
                    $aPosCMD[1] & "+(" & $aPosCMD[3] & "-$a_PosWin[3])/2)" & @CRLF & "WinSetState($h_Win,'',@SW_SHOW)" & @CRLF & "Exit"
    EndSwitch
    $s_ScriptText &= @CRLF & "Func _WinAPI_GetParent($hWnd)" & @CRLF & "Local $aResult = DllCall('user32.dll', 'hwnd', 'GetParent', 'hwnd', $hWnd)" & @CRLF & _
            "If @error Then Return SetError(@error, @extended, 0)" & @CRLF & "Return $aResult[0]" & @CRLF & "EndFunc"
    Do
        $s_TempFile = ''
        For $i = 1 To 5
            $s_TempFile &= Chr(Random(48, 57, 1))
        Next
        $s_TempFile = @TempDir & '\~' & $s_TempFile & '.dmb'
    Until Not FileExists($s_TempFile)
    $h_File = FileOpen($s_TempFile, 2)
    FileWrite($h_File, $s_ScriptText)
    FileClose($h_File)
    Run('"' & @AutoItExe & '" /AutoIt3ExecuteScript "' & $s_TempFile & '"')
EndFunc   ;==>_ExecuteScript
 
Func _CalculateMove(ByRef $i_X, ByRef $i_Y, $h_Wnd)
    Local $a_PoshWnd = WinGetPos($h_Wnd)
    If @error Or UBound($a_PoshWnd) <> 4 Then Return SetError(1)
    If $iNoErrorCMD Then
        $i_X = $aPosCMD[0] + ($aPosCMD[2] - $a_PoshWnd[2]) / 2
        $i_Y = $aPosCMD[1]
    Else
        $i_X = (@DesktopWidth - $a_PoshWnd[2]) / 2
        $i_Y = (@DesktopHeight - $a_PoshWnd[3]) / 2
    EndIf
EndFunc   ;==>_CalculateMove
 
Func _ConsoleWrite($i_Exit, $s_Text = '')
    If Not $i_Exit Then
        If Not $iNo_Encoding Then
            $s_Text = _Encoding_ANSIToOEM($s_Text)
        EndIf
        ConsoleWrite($s_Text)
    EndIf
    FileDelete(@TempDir & '\*.dmb')
    Exit $i_Exit
EndFunc   ;==>_ConsoleWrite
#endregion Func
 
#region From Encoding.au3
;[url]http://autoit-script.ru/index.php/topic,510.0.html[/url]
Func _Encoding_ANSIToOEM($strText)
    Local $sBuffer = DllStructCreate('char[' & StringLen($strText) + 1 & ']')
    Local $aRet = DllCall('User32.dll', 'int', 'CharToOem', 'str', $strText, 'ptr', DllStructGetPtr($sBuffer))
    If Not IsArray($aRet) Then Return SetError(1, 0, '')
    If $aRet[0] = 0 Then Return SetError(2, $aRet[0], '')
    Return DllStructGetData($sBuffer, 1)
EndFunc   ;==>_Encoding_ANSIToOEM
#endregion From Encoding.au3
 
#region From WinAPIEx.au3
;[url]http://autoit-script.ru/index.php/topic,47.0.html[/url]
Func _WinAPI_BrowseForFolderDlg($sRoot = '', $sText = '', $iFlags = 0, $pBrowseProc = 0, $lParam = 0, $hParent = 0)
    Local $tBROWSEINFO = DllStructCreate('hwnd;ptr;ptr;ptr;int;ptr;uint_ptr;int;wchar[' & (StringLen($sText) + 1) & '];wchar[260]')
    Local $PIDL = 0, $Path, $Result = ''
    If StringStripWS($sRoot, 3) Then
        $Path = _WinAPI_PathSearchAndQualify($sRoot, 1)
        If @error Then
            $Path = $sRoot
        EndIf
        $PIDL = _WinAPI_ShellILCreateFromPath($Path)
        If @error Then
        EndIf
    EndIf
    DllStructSetData($tBROWSEINFO, 1, $hParent)
    DllStructSetData($tBROWSEINFO, 2, $PIDL)
    DllStructSetData($tBROWSEINFO, 3, DllStructGetPtr($tBROWSEINFO, 10))
    DllStructSetData($tBROWSEINFO, 4, DllStructGetPtr($tBROWSEINFO, 9))
    DllStructSetData($tBROWSEINFO, 5, $iFlags)
    DllStructSetData($tBROWSEINFO, 6, $pBrowseProc)
    DllStructSetData($tBROWSEINFO, 7, $lParam)
    DllStructSetData($tBROWSEINFO, 8, 0)
    DllStructSetData($tBROWSEINFO, 9, $sText)
    Local $Ret = DllCall('shell32.dll', 'ptr', 'SHBrowseForFolderW', 'ptr', DllStructGetPtr($tBROWSEINFO))
    If @error Then
        Return SetError(1, 0, '')
    Else
        If Not $Ret[0] Then
            Return ''
        EndIf
    EndIf
    $Result = _WinAPI_ShellGetPathFromIDList($Ret[0])
    _WinAPI_CoTaskMemFree($Ret[0])
    If $PIDL Then
        _WinAPI_CoTaskMemFree($PIDL)
    EndIf
    If Not $Result Then
        Return SetError(1, 0, '')
    EndIf
    Return $Result
EndFunc   ;==>_WinAPI_BrowseForFolderDlg
 
Func _WinAPI_CoTaskMemFree($hMemory)
    DllCall('ole32.dll', 'int', 'CoTaskMemFree', 'ptr', $hMemory)
    If @error Then
        Return SetError(1, 0, 0)
    EndIf
    Return 1
EndFunc   ;==>_WinAPI_CoTaskMemFree
 
Func _WinAPI_PathSearchAndQualify($sPath, $fExists = 0)
    Local $Ret = DllCall('shlwapi.dll', 'int', 'PathSearchAndQualifyW', 'wstr', $sPath, 'wstr', '', 'int', 4096)
    If (@error) Or (Not $Ret[0]) Then
        Return SetError(1, 0, '')
    EndIf
    If ($fExists) And (Not FileExists($Ret[2])) Then
        Return SetError(2, 0, '')
    EndIf
    Return $Ret[2]
EndFunc   ;==>_WinAPI_PathSearchAndQualify
 
Func _WinAPI_ShellGetPathFromIDList($PIDL)
    Local $Ret = DllCall('shell32.dll', 'int', 'SHGetPathFromIDListW', 'ptr', $PIDL, 'wstr', '')
    If (@error) Or (Not $Ret[0]) Then
        Return SetError(1, 0, '')
    EndIf
    Return $Ret[2]
EndFunc   ;==>_WinAPI_ShellGetPathFromIDList
 
Func _WinAPI_ShellILCreateFromPath($sPath)
    Local $Ret = DllCall('shell32.dll', 'uint', 'SHILCreateFromPath', 'wstr', $sPath, 'ptr*', 0, 'dword*', 0)
    If @error Then
        Return SetError(1, 0, 0)
    Else
        If $Ret[0] Then
            Return SetError(1, $Ret[0], 0)
        EndIf
    EndIf
    Return $Ret[2]
EndFunc   ;==>_WinAPI_ShellILCreateFromPath
 
Func _WinAPI_GetParentProcess($PID = 0)
    If Not $PID Then
        $PID = @AutoItPID
    EndIf
    Local $hSnapshot = DllCall('kernel32.dll', 'ptr', 'CreateToolhelp32Snapshot', 'dword', 0x00000002, 'dword', 0)
    If (@error) Or (Not $hSnapshot[0]) Then
        Return SetError(1, 0, 0)
    EndIf
    Local $tPROCESSENTRY32 = DllStructCreate('dword Size;dword Usage;dword ProcessID;ulong_ptr DefaultHeapID;dword ModuleID;dword Threads;dword ParentProcessID;long PriClassBase;dword Flags;wchar ExeFile[260]')
    Local $pPROCESSENTRY32 = DllStructGetPtr($tPROCESSENTRY32)
    Local $Ret, $Result = 0
    $hSnapshot = $hSnapshot[0]
    DllStructSetData($tPROCESSENTRY32, 'Size', DllStructGetSize($tPROCESSENTRY32))
    $Ret = DllCall('kernel32.dll', 'int', 'Process32FirstW', 'ptr', $hSnapshot, 'ptr', $pPROCESSENTRY32)
    While (Not @error) And ($Ret[0])
        If DllStructGetData($tPROCESSENTRY32, 'ProcessID') = $PID Then
            $Result = DllStructGetData($tPROCESSENTRY32, 'ParentProcessID')
            ExitLoop
        EndIf
        $Ret = DllCall('kernel32.dll', 'int', 'Process32NextW', 'ptr', $hSnapshot, 'ptr', $pPROCESSENTRY32)
    WEnd
    _WinAPI_CloseHandle($hSnapshot)
    If Not $Result Then
        Return SetError(1, 0, 0)
    EndIf
    Return $Result
EndFunc   ;==>_WinAPI_GetParentProcess
#endregion From WinAPIEx.au3
 
#region From WinAPI.au3
Func _WinAPI_CloseHandle($hObject)
    Local $aResult = DllCall("kernel32.dll", "bool", "CloseHandle", "handle", $hObject)
    If @error Then Return SetError(@error, @extended, False)
    Return $aResult[0]
EndFunc   ;==>_WinAPI_CloseHandle
#endregion From WinAPI.au3
 
:addFFCompatRegKey
set "WIN7RTM=~ WIN7RTM"
if not exist "%DlgMsgBoxexe%" (exit /b 1)
reg add "HKCU\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" /v "%DlgMsgBoxexe%" /t REG_SZ /d "%WIN7RTM%" /f >nul 2>&1
exit /b %errorlevel%
 
:delFFCompatRegKey
reg delete "HKCU\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" /v "%DlgMsgBoxexe%" /f >nul 2>&1
exit /b %errorlevel%
Цитата Сообщение от @Root Посмотреть сообщение
Была у меня прога, крашилась и под семеркой и под восьмеркой, добавил параметр совместимости, стала работать без проблем
Не совсем вас понял? DlgMsgBox не работал у Вас?
0
⁞ ★☭ Mad Max ☭★ ⁞
279 / 84 / 12
Регистрация: 04.09.2013
Сообщений: 187
26.08.2015, 10:01
lorents,
мой код для bat. При запуске bat он добавляет в реестр параметр совместимости для DlgMsgBox,
ведь если я правильно понял, до Вин10 прога работала, а в Вин10 нет.
И еще:
Windows Batch file
1
set "DlgMsgBoxexe=тут надо указать полный путь до DlgMsgBox.exe"
0
Эксперт Python
5439 / 3860 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
26.08.2015, 12:15
lorents
Пока решил проблему дополнительной паузой Thread.Sleep(100), поставленной после основной в 10 мск. Пауза совсем небольшая - у DlgMsgBox там все 200 выставлены.
На моем компе все работает идеально - никаких перемещений визуально незаметно, окно просто появляется в указанном месте и с последними пользовательскими размерами. Архив FolderDialog перезалил.
PS: Пробую решить, конечно, и более точным способом - отловить системное сообщение BFFM_INITIALIZED (окончание инициализации диалога) - но написать процедуру пока не получилось.
0
4340 / 2130 / 661
Регистрация: 26.04.2015
Сообщений: 6,823
26.08.2015, 15:38
lorents, Мы вот тут все что-то химичим, химичим, а можно точно и четко поставить задачу, что нужно, я ,например, уже теряюсь в каких-то неизвестных требованиях. Четко, что, зачем и для чего это нужно, может легче переиграть задачу по отношению к каким-то странным требованиям?

Добавлено через 6 минут
Непонято: Первое - зачем наблюдать окно cmd, если для тестирования, можно включить, Второе - зачем что-то центрировать (хоть что-то) если оно, в идеале, потом будет скрыто - это прихоть или как?
0
33 / 6 / 0
Регистрация: 18.05.2014
Сообщений: 127
26.08.2015, 18:01  [ТС]
@Root,
Благодарю!

alpap,
1. Планирую использовать диалоговое окно у мебя в проекте https://github.com/lorents17/iCatalyst
2. пытаюсь найти приложение диалогового окна, которое работает также, как и любое диалоговое окно.
0
4340 / 2130 / 661
Регистрация: 26.04.2015
Сообщений: 6,823
27.08.2015, 09:28
lorents, Ну, наконец-то, что-то разродилось. Скачайте по ссылке Wselect 2.20 и забудьте окно cmd - задача решена, как забыть окно cmd приводил выше.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.08.2015, 09:28

Диалоговое окно для выбора папки
Необходимо диалоговое окно для выбора не файла, а папки Добавлено через 9 минут Нашёл: FolderBrowserDialog

Открыть диалоговое окно выбора папки
Подскажите как сделать диалоговое окно выбора папки с файлами что бы в текстбоксе был виден путь до папки а в листбоксе открылся список...

Диалоговое окно для выбора папок с указанием папки
Подскажите, как указать папку при открытии диалогового? вариант (strFolderPath = Browse4Folder(strPrompt, intOptions,...

Диалоговое окно выбора как папки так и файлов
Можно ли обыграть ситуацию с диалоговыми окнами: Application.FileDialog(msoFileDialogFilePicker) - выбор файла(-ов) ...

Диалоговое окно выбора сервера бд
Здравствуйте. Как программно вызвать такое окно? Нашел статью на хабре: http://habrahabr.ru/post/167067/ Но она старая. Исходники и...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru