Filepath select Topic is solved

Tire suas dúvidas sobre programação em AutoHotkey

Moderator: Gio

thalesduarte
Posts: 95
Joined: 13 Sep 2021, 06:08

Filepath select

07 Feb 2022, 14:45

Olá, boa tarde.

Gostaria de auxilio em uma funcionalidade do AHK.

Estou criando um script cujo preciso selecionar uma pasta para localizar arquivos TXT nessa pasta.

Até ai tudo bem.

Porém, queria que ele abrisse dessa forma, no qual eu consiga selecionar a pasta no meu computador ou colar o diretório da pasta no campo de busca do localizador de pasta para selecionar de forma mais ágil.

Image

Grato pela atenção

Atenciosamente,
Thales
Attachments
image.png
image.png (39.68 KiB) Viewed 868 times
User avatar
Gio
Posts: 1248
Joined: 30 Sep 2013, 10:54
Location: Brazil

Re: Filepath select

07 Feb 2022, 15:16

Boa tarde Thalesduarte.

Não sei se entendi o que você quer fazer exatamente, mas você pode usar um FileSelectFile para selecionar uma pasta com a opção S (ou seja, fazendo isso do diálogo de "salvar como"). A única diferença é que terá de remover o nome do arquivo no final do caminho.

Creio que seria algo como isso:

Code: Select all

FileSelectFile, destino, s, \Selecionar aqui
If (destino = "")
{
	msgbox % "Erro: nenhuma pasta selecionada"
}
else
{
	StringSplit, destino_, destino, \
	Pasta_Selecionada := ""
	Loop % destino_0
	{
		If (A_index = destino_0)
		{
			Continue
		}
		Pasta_Selecionada := Pasta_Selecionada . destino_%A_Index% . "\"
	}
	msgbox % "Você selecionou a pasta: " . Pasta_Selecionada
}
thalesduarte
Posts: 95
Joined: 13 Sep 2021, 06:08

Re: Filepath select

08 Feb 2022, 05:44

Prezado Gio, bom dia, tudo bem?
Obrigado pela resposta.

É basicamente isso, a unica diferença é que o Save As permitiria selecionar uma pasta, e não um arquivo.

Como faço para permitir somente selecionar pastas?
User avatar
Gio
Posts: 1248
Joined: 30 Sep 2013, 10:54
Location: Brazil

Re: Filepath select  Topic is solved

08 Feb 2022, 09:21

Bom dia Thalesduarte.

Você tem essas duas opções padrão: o diálogo de selecionar arquivos (FileSelectFile) e o diálogo de selecionar pastas (FileSelectFolder). Porém as interfaces não são iguais, e a de selecionar pastas é bem "menor" que a de selecionar arquivos (em termos de opções).

Mas se nenhuma das duas opções padrão estiver do seu agrado, você ainda pode criar a sua própria opção. Isso não é tão difícil de fazer, mas pode te levar um dia ou dois dependendo do seu conhecimento.

Outra opção ainda é procurar um código que alguém já tenha criado e disponibilizado para uso nos fórums. Eu achei este aqui do usuário Just Me que parece fazer tudo que você quer. Ele disponibilizou o código através de uma função com licença de domínio público, então é bem fácil implementar e você pode usar à vontade.

Exemplo de uso do código dele:

Code: Select all

Msgbox % "Você selecionou esta pasta: '" SelectFolderEx(StartingFolder := "", Prompt := "Selecione uma pasta", OwnerHwnd := 0, OkBtnLabel := "Selecionar") "'"


Return
; ==================================================================================================================================
; Shows a dialog to select a folder.
; Depending on the OS version the function will use either the built-in FileSelectFolder command (XP and previous)
; or the Common Item Dialog (Vista and later).
; Parameter:
;     StartingFolder -  the full path of a folder which will be preselected.
;     Prompt         -  a text used as window title (Common Item Dialog) or as text displayed withing the dialog.
;     ----------------  Common Item Dialog only:
;     OwnerHwnd      -  HWND of the Gui which owns the dialog. If you pass a valid HWND the dialog will become modal.
;     BtnLabel       -  a text to be used as caption for the apply button.
;  Return values:
;     On success the function returns the full path of selected folder; otherwise it returns an empty string.
; MSDN:
;     Common Item Dialog -> msdn.microsoft.com/en-us/library/bb776913%28v=vs.85%29.aspx
;     IFileDialog        -> msdn.microsoft.com/en-us/library/bb775966%28v=vs.85%29.aspx
;     IShellItem         -> msdn.microsoft.com/en-us/library/bb761140%28v=vs.85%29.aspx
; ==================================================================================================================================
SelectFolderEx(StartingFolder := "", Prompt := "", OwnerHwnd := 0, OkBtnLabel := "") {
   Static OsVersion := DllCall("GetVersion", "UChar")
        , IID_IShellItem := 0
        , InitIID := VarSetCapacity(IID_IShellItem, 16, 0)
                  & DllCall("Ole32.dll\IIDFromString", "WStr", "{43826d1e-e718-42ee-bc55-a1e261c37bfe}", "Ptr", &IID_IShellItem)
        , Show := A_PtrSize * 3
        , SetOptions := A_PtrSize * 9
        , SetFolder := A_PtrSize * 12
        , SetTitle := A_PtrSize * 17
        , SetOkButtonLabel := A_PtrSize * 18
        , GetResult := A_PtrSize * 20
   SelectedFolder := ""
   If (OsVersion < 6) { ; IFileDialog requires Win Vista+, so revert to FileSelectFolder
      FileSelectFolder, SelectedFolder, *%StartingFolder%, 3, %Prompt%
      Return SelectedFolder
   }
   OwnerHwnd := DllCall("IsWindow", "Ptr", OwnerHwnd, "UInt") ? OwnerHwnd : 0
   If !(FileDialog := ComObjCreate("{DC1C5A9C-E88A-4dde-A5A1-60F82A20AEF7}", "{42f85136-db7e-439c-85f1-e4075d135fc8}"))
      Return ""
   VTBL := NumGet(FileDialog + 0, "UPtr")
   ; FOS_CREATEPROMPT | FOS_NOCHANGEDIR | FOS_PICKFOLDERS
   DllCall(NumGet(VTBL + SetOptions, "UPtr"), "Ptr", FileDialog, "UInt", 0x00002028, "UInt")
   If (StartingFolder <> "")
      If !DllCall("Shell32.dll\SHCreateItemFromParsingName", "WStr", StartingFolder, "Ptr", 0, "Ptr", &IID_IShellItem, "PtrP", FolderItem)
         DllCall(NumGet(VTBL + SetFolder, "UPtr"), "Ptr", FileDialog, "Ptr", FolderItem, "UInt")
   If (Prompt <> "")
      DllCall(NumGet(VTBL + SetTitle, "UPtr"), "Ptr", FileDialog, "WStr", Prompt, "UInt")
   If (OkBtnLabel <> "")
      DllCall(NumGet(VTBL + SetOkButtonLabel, "UPtr"), "Ptr", FileDialog, "WStr", OkBtnLabel, "UInt")
   If !DllCall(NumGet(VTBL + Show, "UPtr"), "Ptr", FileDialog, "Ptr", OwnerHwnd, "UInt") {
      If !DllCall(NumGet(VTBL + GetResult, "UPtr"), "Ptr", FileDialog, "PtrP", ShellItem, "UInt") {
         GetDisplayName := NumGet(NumGet(ShellItem + 0, "UPtr"), A_PtrSize * 5, "UPtr")
         If !DllCall(GetDisplayName, "Ptr", ShellItem, "UInt", 0x80028000, "PtrP", StrPtr) ; SIGDN_DESKTOPABSOLUTEPARSING
            SelectedFolder := StrGet(StrPtr, "UTF-16"), DllCall("Ole32.dll\CoTaskMemFree", "Ptr", StrPtr)
         ObjRelease(ShellItem)
   }  }
   If (FolderItem)
      ObjRelease(FolderItem)
   ObjRelease(FileDialog)
   Return SelectedFolder
}

Perceba como a função permite que você mude os diálogos da tela e até o nome do botão a ser clicado nos próprios parâmetros da função.

Consulte o tópico original desta função aqui e se você gostar dela, não se esqueça de postar um agradecimento ao autor :thumbup: .
thalesduarte
Posts: 95
Joined: 13 Sep 2021, 06:08

Re: Filepath select

08 Feb 2022, 09:31

Obrigado Gio, era exatamente isso que estava procurando.

Grato pela atenção, irei agradecer o autor do código também!

Novamente.
Obrigado!

Return to “Ajuda e Suporte Geral”

Who is online

Users browsing this forum: No registered users and 5 guests