1 (изменено: krabik-1337, 2019-07-08 10:26:58)

Тема: AHK: Поиск приложения и запуск его.

Всем привет. Кто знает, какую функцию использовать для поиска и запуска приложения? Например, нужно чтобы пользователь нажимал кнопку и ему запускалось определенное приложение. Как бы я то могу сделать, но только если задам определенный путь, а у всех он может быть абсолютно разный, можно ли сделать чтобы искалось приложение на компьютере и если находилось то запускалось, а если не найдено то msgbox, не найдено. ?

2

Re: AHK: Поиск приложения и запуск его.

А оно установлено или просто скопировано на компьютер? Если установлено, то приложения, как правило, прописываются в реестре.

3

Re: AHK: Поиск приложения и запуск его.

ypppu Это игра. Она установлена.

4

Re: AHK: Поиск приложения и запуск его.

Ищите в HKEY_LOCAL_MACHINE\SOFTWARE.

5 (изменено: teadrinker, 2019-07-09 01:46:20)

Re: AHK: Поиск приложения и запуск его.

Так можно искать по exe:

SetBatchLines, -1
MsgBox, % SearchExe("chrome.exe")

for k, v in SearchExe("uninstall.exe", false)
   MsgBox, % v

SearchExe(exeName, firstOnly := true) {
   ( !firstOnly && foundPaths := [] )
   for k, v in GetAppsInfo("IMAGE") {
      RegExMatch(v, "[^,""]+", filePath)
      if SubStr(fileName, -2) != "exe"
         continue
      SplitPath, filePath, fileName, dir
      if (exeName = fileName) {
         found := true
         if firstOnly
            break
         foundPaths.Push(filePath)
      }
   }
   if !(found && firstOnly) {
      for k, v in GetAppsInfo("INSTALLLOCATION") {
         if (v = "")
            continue
         dir := RegExReplace(v, """|\\$")
         Loop, Files, % dir . "\*.exe", F
         {
            if (A_LoopFileName = exeName) {
               filePath := A_LoopFileLongPath
               found := true
               if firstOnly
                  break 2
               foundPaths.Push(filePath)
            }
         }
      }
   }
   Return found ? (firstOnly ? filePath : foundPaths) : ""
}

GetAppsInfo(infoType)  {
   static CLSID_EnumInstalledApps := "{0B124F8F-91F0-11D1-B8B5-006008059382}"
        , IID_IEnumInstalledApps  := "{1BC752E1-9046-11D1-B8B3-006008059382}"
        , InfoNames := [ {name: "DISPLAYNAME"      , mask: 0x00000001}
                       , {name: "VERSION"          , mask: 0x00000002}
                       , {name: "PUBLISHER"        , mask: 0x00000004}
                       , {name: "PRODUCTID"        , mask: 0x00000008}
                       , {name: "REGISTEREDOWNER"  , mask: 0x00000010}
                       , {name: "REGISTEREDCOMPANY", mask: 0x00000020}
                       , {name: "LANGUAGE"         , mask: 0x00000040}
                       , {name: "SUPPORTURL"       , mask: 0x00000080}
                       , {name: "SUPPORTTELEPHONE" , mask: 0x00000100}
                       , {name: "HELPLINK"         , mask: 0x00000200}
                       , {name: "INSTALLLOCATION"  , mask: 0x00000400}
                       , {name: "INSTALLSOURCE"    , mask: 0x00000800}
                       , {name: "INSTALLDATE"      , mask: 0x00001000}
                       , {name: "CONTACT"          , mask: 0x00004000}
                       , {name: "COMMENTS"         , mask: 0x00008000}
                       , {name: "IMAGE"            , mask: 0x00020000}
                       , {name: "READMEURL"        , mask: 0x00040000}
                       , {name: "UPDATEINFOURL"    , mask: 0x00080000}
                       , {name: "ALL"              , mask: 0x000EDFFF} ]
        
   pEIA := ComObjCreate(CLSID_EnumInstalledApps, IID_IEnumInstalledApps)
   arr := []
   for k, v in InfoNames
      if (v.name = infoType && found := true)
         break
   if !found
      throw Exception("Wrong info type!")
   ( infoType = "ALL" && InfoNames.Pop() )
   
   while DllCall(NumGet(NumGet(pEIA+0) + A_PtrSize*3), Ptr, pEIA, PtrP, pINA) = 0  {
      VarSetCapacity(APPINFODATA, size := 4*2 + A_PtrSize*18, 0)
      NumPut(size  , APPINFODATA)
      NumPut(v.mask, APPINFODATA, 4)
      DllCall(NumGet(NumGet(pINA+0) + A_PtrSize*3), Ptr, pINA, Ptr, &APPINFODATA)
      ObjRelease(pINA)
      if (infoType != "ALL") {
         pData := NumGet(APPINFODATA, 8 + A_PtrSize*(k - 1))
         arr.Push(pData ? StrGet(pData, "UTF-16") : "")
      }
      else {
         appInfo := {}
         for i, j in InfoNames {
            pData := NumGet(APPINFODATA, 8 + A_PtrSize*(i - 1))
            appInfo[j] := pData ? StrGet(pData, "UTF-16") : ""
         }
         arr.Push(appInfo)
      }
   }
   Return arr
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

6

Re: AHK: Поиск приложения и запуск его.

Вся информация об установленных приложениях:

#NoEnv
SetBatchLines, -1

arr := GetAppsInfo("ALL")
for k, v in arr[1]
   headers .= (headers = "" ? "" : "|") . v.name

Gui, +Resize
Gui, Margin, 0, 0
Gui, Add, ListView, Grid, % headers
listViewArr := []
for k, v in arr
   for i, j in v
      listViewArr[k, i] := j.value
   
for k, v in listViewArr
   LV_Add("", v*)

Loop % arr[1].length()
   LV_ModifyCol(A_Index, "AutoHdr")
Gui, Show, w1400 h900
Return

GuiSize:
   GuiControl, Move, SysListView321, w%A_GuiWidth% h%A_GuiHeight%
   Return
   
GuiClose:
   ExitApp

GetAppsInfo(infoType)  {
   static CLSID_EnumInstalledApps := "{0B124F8F-91F0-11D1-B8B5-006008059382}"
        , IID_IEnumInstalledApps  := "{1BC752E1-9046-11D1-B8B3-006008059382}"
        , InfoNames := [ {name: "DISPLAYNAME"      , mask: 0x00000001}
                       , {name: "VERSION"          , mask: 0x00000002}
                       , {name: "PUBLISHER"        , mask: 0x00000004}
                       , {name: "PRODUCTID"        , mask: 0x00000008}
                       , {name: "REGISTEREDOWNER"  , mask: 0x00000010}
                       , {name: "REGISTEREDCOMPANY", mask: 0x00000020}
                       , {name: "LANGUAGE"         , mask: 0x00000040}
                       , {name: "SUPPORTURL"       , mask: 0x00000080}
                       , {name: "SUPPORTTELEPHONE" , mask: 0x00000100}
                       , {name: "HELPLINK"         , mask: 0x00000200}
                       , {name: "INSTALLLOCATION"  , mask: 0x00000400}
                       , {name: "INSTALLSOURCE"    , mask: 0x00000800}
                       , {name: "INSTALLDATE"      , mask: 0x00001000}
                       , {name: "CONTACT"          , mask: 0x00004000}
                       , {name: "COMMENTS"         , mask: 0x00008000}
                       , {name: "IMAGE"            , mask: 0x00020000}
                       , {name: "READMEURL"        , mask: 0x00040000}
                       , {name: "UPDATEINFOURL"    , mask: 0x00080000}
                       , {name: "ALL"              , mask: 0x000EDFFF} ]
        
   pEIA := ComObjCreate(CLSID_EnumInstalledApps, IID_IEnumInstalledApps)
   arr := []
   for k, v in InfoNames
      if (v.name = infoType && found := true)
         break
   if !found
      throw Exception("Wrong info type!")
   ( infoType = "ALL" && InfoNames.Pop() )
   
   while DllCall(NumGet(NumGet(pEIA+0) + A_PtrSize*3), Ptr, pEIA, PtrP, pINA) = 0  {
      VarSetCapacity(APPINFODATA, size := 4*2 + A_PtrSize*18, 0)
      NumPut(size  , APPINFODATA)
      NumPut(v.mask, APPINFODATA, 4)
      DllCall(NumGet(NumGet(pINA+0) + A_PtrSize*3), Ptr, pINA, Ptr, &APPINFODATA)
      ObjRelease(pINA)
      if (infoType != "ALL") {
         pData := NumGet(APPINFODATA, 8 + A_PtrSize*(k - 1))
         arr.Push(pData ? StrGet(pData, "UTF-16") : "")
      }
      else {
         appInfo := []
         for i, j in InfoNames {
            pData := NumGet(APPINFODATA, 8 + A_PtrSize*(i - 1))
            appInfo.Push({name: j.name, value: pData ? StrGet(pData, "UTF-16") : ""})
         }
         arr.Push(appInfo)
      }
   }
   Return arr
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

7

Re: AHK: Поиск приложения и запуск его.

Подправил SearchExe().

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

8

Re: AHK: Поиск приложения и запуск его.

teadrinker пишет:

Вся информация об установленных приложениях:

На автохотки 32 битах многие приложения не показывает.
Например эксел.

9

Re: AHK: Поиск приложения и запуск его.

У меня тоже не показывает на 64. Но Excel я так же почему-то не вижу в Программах и компонентах.

Run appwiz.cpl
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

10

Re: AHK: Поиск приложения и запуск его.

На ahk 64 бит у меня эксел показывает, также показывает в программах и компонентах (эксел 2016).
Другой пример - на ahk32 firefox не показывается, на ahk64 есть.

11

Re: AHK: Поиск приложения и запуск его.

Да, разница есть на разных битностях. Пока не вижу в чём причина.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

12

Re: AHK: Поиск приложения и запуск его.

Скорее всего, так и задумано. На 32-скрипте показывает только 32-битные приложения.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

13

Re: AHK: Поиск приложения и запуск его.

Адобовский 64-битный софт на ahk32 бит почему-то показывает.

14

Re: AHK: Поиск приложения и запуск его.

У меня вроде нет. А ты уверен, что он 64-битный? Там могут быть 32-битные exe.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

15

Re: AHK: Поиск приложения и запуск его.

Adobe Premiere CC 2017 точно 64-битный и он у меня показывается на ahk32 бит.
Может быть, потому что у меня установлен creative cloud, который управляет всем адобовским софтом, а сам он 32-битный.
Кстати, на stackoverflow советуют просто проверять ключ "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
https://stackoverflow.com/questions/908 … n-a-system

16

Re: AHK: Поиск приложения и запуск его.

Через реестр так вышло:

#NoEnv
SetBatchLines, -1

arr := GetAppsInfo()
for k, v in arr[1]
   headers .= (headers = "" ? "" : "|") . v.name

Gui, +Resize
Gui, Margin, 0, 0
Gui, Add, ListView, Grid, % headers
listViewArr := []
for k, v in arr
   for i, j in v
      listViewArr[k, i] := j.value
   
for k, v in listViewArr
   LV_Add("", v*)

Loop % arr[1].length()
   LV_ModifyCol(A_Index, "AutoHdr")
LV_ModifyCol(1, "Sort")
Gui, Show, w1200 h600, % "Найдено " . arr.MaxIndex() . " приложений"
Return

GuiSize:
   GuiControl, Move, SysListView321, w%A_GuiWidth% h%A_GuiHeight%
   Return
   
GuiClose:
   ExitApp

GetAppsInfo() {
   infoNames := [ "DisplayName"  , "DisplayVersion", "InstallLocation"
                , "InstallDate"  , "DisplayIcon"   , "InstallSource"
                , "Publisher"    , "HelpLink"      , "HelpTelephone"
                , "Contact"      , "Comments"      , "Readme"
                , "URLInfoAbout" , "URLUpdateInfo" ]
   arr := [], used := {}
   Loop % A_Is64bitOS + 1 {
      SetRegView, % 32 * A_Index
      for k, root in ["HKCU", "HKLM"] {
         Loop, Reg, % root . "\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall", K
         {
            appInfo := [], enumValue := ""
            for k, name in infoNames {
               RegRead, value, % root . "\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" . A_LoopRegName, % name
               if (name = "DisplayName" && value = "")
                  continue 2
               if (name = "DisplayName" || name = "DisplayVersion")
                  enumValue .= value
               if (name = "DisplayVersion") {
                  if used.HasKey(enumValue)
                     continue 2
                  used[enumValue] := ""
               }
               appInfo.Push({name: name, value: value})
            }
            arr.Push(appInfo)
         }
      }
   }
   Return arr
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder