Что нового

Диалоговое окно для CMD

lorents

Новичок
Сообщения
82
Репутация
1
Добрый вечер!
Подскажите, пожалуйста, можно ли используя AutoIT открыть через cmd диалоговое окно выбора фалов и передать выбранные файлы в cmd. Самое главное, чтобы в панели задач при открытии диалогового окна не было значка, и желательно, чтобы диалоговое окно было поверх окна cmd.
Как это можно реализовать?
 

joiner

Модератор
Локальный модератор
Сообщения
3,557
Репутация
628
Re: Диалоговое окно выбора фалов

lorents
а зачем тебе cmd?
в Autoit для выбора файлов команда
Код:
FileOpenDialog

а
Код:
#NoTrayIcon
для скрытия в трее
или я не так понял? :smile:
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
Re: Диалоговое окно выбора фалов

Так ? или я не правильно понял ?:
Код:
Global $TempFile = @TempDir & '\temp.bat'

$Files = FileOpenDialog('', '', 'All files (*.*)', 4, '', GUICreate(''))
If @error Then Exit
$Split = StringSplit($Files, '|')

FileWriteLine($TempFile, '@echo off')
For $i = 2 To $Split[0]
    FileWriteLine($TempFile, 'echo ' & FileGetShortName($Split[1] & '\' & $Split[$i]))
Next
FileWriteLine($TempFile, 'Pause')
Sleep(1000)
ShellExecuteWait($TempFile)
FileDelete($TempFile)
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Re: Диалоговое окно выбора фалов

Да и зачем использовать cmd, если выполнить какие - то действия над файлами, так это с помощью AutoIt можно сделать без лишних телодвижений, хоть скрытно, хоть открыто....
 
Автор
L

lorents

Новичок
Сообщения
82
Репутация
1
Re: Диалоговое окно выбора фалов

Viktor1703 у меня есть проект Image Catalyst основанный на batch, batch в свю очередь не поддерживает диалоговые окна, потому искал другие варианты реализации, найденные варианты не подходили мне, подумал может autoit устроит.

Zaramot
Не могли вы еще подсказать, как мне запустить скрипт именно через командную строку?
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
Re: Диалоговое окно выбора фалов

lorents
думаю имеет смысл попробовать написать версию 3.0 на AutoIT
 
Автор
L

lorents

Новичок
Сообщения
82
Репутация
1
Re: Диалоговое окно выбора фалов

Medic84 я тоже об этом думал, но знаний нету пока таких.
Я как понял, AutoIT поддерживает GUI, можно даже его сделать. А вообще интересно стало, есть ли в AutoIT такой функционал как:
1. Объект TreeList
2. поддержка многопоточности
3. Одновременная работа только одной копии GUI
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Re: Диалоговое окно выбора фалов

lorents,
1. Да, если Вы имеете в виду TreeView.
2. Вообще нет, но иногда можно, в зависимости от конкретной задачи.
3. Да.
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
Re: Диалоговое окно выбора фалов

lorents [?]
но знаний нету пока таких
ИМХО лучше всего учиться языку, когда пишешь какой либо проект.
Я вот C# не знаю, хотя пишу IDE для AutoIT ;)

Справку в руки, форум в ноги и в перед :ok:
 
Автор
L

lorents

Новичок
Сообщения
82
Репутация
1
Re: Диалоговое окно выбора фалов

madmasles
1. скинул пример объекта
2. имею ввиду, что можно допустить 4 консольные программы запустить подряд, и ждать их завершения

Medic84 не спорю, чтобы начать проект, надо с начало в языке хоть как-то разобраться.
я кстати так с командной строкой учился работать.

А как мне все-таки вышеприведенный код запустить через командную строку?
нашел возможность конвертировать скрипт в консольное приложение, мне хочется просто перенести в свой проект скрипт и отдельно программу для запуска скрипта, и еще как мне передавать выбранные файлы не в новое окно cmd, а в текущее, и можно ли допустим запустить скрипт с параметрами через cmd?
 

AZJIO

Меценат
Меценат
Сообщения
2,892
Репутация
1,196
Re: Диалоговое окно выбора фалов

lorents
можно ли допустим запустить скрипт с параметрами через cmd?
Да
Код:
"AutoIt3.exe" "script.au3" key1 key2 "key 3"
В скрипте массив $CmdLine содержит параметры ком-строки.
В справке читать раздел AutoIt\Исползование AutoIt\Параметры командной строки.
 
Автор
L

lorents

Новичок
Сообщения
82
Репутация
1
AZJIO благодарю за справку, пойду читать

На счет запуска вышеприведенного скрипта открытия диалогового окна, если я запускаю скрипт через AutoIt3.exe в cmd, если я закрою окно cmd, то диалоговое окно не закрывается. Как можно исправить?

Хочу измерить скорость работы скрипта, не мог ли кто-нибудь сделать один пример.
есть допустим два файла с разной датой и временем модификации файла, необходимо сделать время модификации файлов одинаковыми.

Код:
"AutoIt3.exe" "script.au3" "файл 1" "файл 2"

Просто интересно, быстро это все работает или медленно. Делал такой скрипт на vbs, просто медляк.
и еще есть ли встроенный способ извлечения информации из JPEG, если нету, можно ли использовать AutoIt3 как hex-редактор, для извлечения необходимой информации?

Дамы и господа, ни кто не хотел помочь моему проекту в написании нескольких скриптов?
При этом указании автора(ов) скриптов является обязательным, и то что проект использует AutoIt3 тоже.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Предупреждение За нарушение общих правил (пункт В.4):
Не лепите несколько вопросов разной тематики в один пост. По типу "Ребят, а ещё такой вопрос...". Каждый вопрос в свою тему.


С уважением, ваш Модератор.
 
Автор
L

lorents

Новичок
Сообщения
82
Репутация
1
madmasles прошу прощения
здесь буду разбираться с диалоговыми окнами.
 
Автор
L

lorents

Новичок
Сообщения
82
Репутация
1
на счет диалогового окна, допустим я запускаю диалоговое окно из CMD, как организовать передачу выбранных файлов в тоже окно cmd, если можно без текстовых файлов.
И еще, как при запуске диалогового окна, сделать его поверх окна CMD
 

gora

Знающий
Сообщения
315
Репутация
19
lorents
Переписывайте весь Ваш проект на AutoIt и не ломайте голову над передачей данных. Посмотрел я Ваш батник и не увидел там ни чего такого, что нельзя было бы реализовать на AutoIt.
 
Автор
L

lorents

Новичок
Сообщения
82
Репутация
1
весь проект нет смысла переписывать, лучше тогда начать делать gui
поэтому пока думаю лучше по частям переписывать, и я только начал изучать данный скриптовый язык.
Если хотите присоединяйтесь в создании GUI, буду только рад.
 
Автор
L

lorents

Новичок
Сообщения
82
Репутация
1
Добрый вечер!
Начну с самого начала. madmasles написал мне скрипт по запуску диалоговых окон из окна cmd, за что ему большое спасибо. Скрипт довольно сложный (для меня), но очень функциональный.

Код:
#NoTrayIcon

Opt('MustDeclareVars', 1)
Opt('WinWaitDelay', 0)
Opt('WinTitleMatchMode', 2)

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 & "$h_Win = WinWait('[Title:" & $sTitleBox & ";Class:#32770]','',5)" & @CRLF & _
			"If Not $h_Win Then Exit" & @CRLF & "$h_Win = 0" & @CRLF & "$a_List = WinList('[Title:" & $sTitleBox & ";Class:#32770]')" & @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" & @CRLF & "EndIf" & @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 3
			$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
;http://autoit-script.ru/index.php/topic,510.0.html
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
;http://autoit-script.ru/index.php/topic,47.0.html
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


Заметил один баг связанный с функцией Msg.
Если я запускаю параллельно два диалоговых окна Msg1, то одно диалоговое окно посередине окна cmd (как и задумано), а другое диалоговое окно посередине окна монитора.
Интересно, то что баг работает, только если значения Msg одинаковые, т.е. Msg1 и Msg1. или Msg2 и Msg2 и .т.д.
Если значения разные (например Msg1 и Msg2), то проблем нету.

К сожалению madmasles не знает как исправить это баг. Может кто сможет подсказать?

Сам проект http://rghost.ru/37638430
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Я не понял, у тебя уже есть точно такая тема, чем эта отличается?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Объединил обе темы.
 
Верх