1

Тема: AHK: запуск консоли в фоновом режиме

Доброго времени суток.

Задача: достучатся до сети ModBus из AHK . Нашел консольное приложение modpoll, пример кода - из Help'a AHK. Вызываю modpoll из скрипта с перехватом StdOut, все работает.

Код AHK:


String = " C:\Users\HP\Desktop\Log\win\modpoll -b 9600 -p none -s 1 -m tcp -o 3 -t 3:float -a 10 -r 256 -c 1 -1 192.168.10.245 "
CommandLine = %ComSpec% /c %String%

shell := ComObjCreate("WScript.Shell")
exec := shell.Exec(CommandLine) 
Result := exec.StdOut.ReadAll()

Вопрос в том, как добиться, чтобы консоль запускалась в фоновом режиме и не докучала выскакивающим окном?

2

Re: AHK: запуск консоли в фоновом режиме

Не в курсе, что такое ModBus и modpoll, но можно попробовать так запустить:

MsgBox, % CmdRet(CommandLine)

CmdRet(sCmd, callBackFuncObj := "", encoding := "CP866")
{
   static HANDLE_FLAG_INHERIT := 0x00000001, flags := HANDLE_FLAG_INHERIT
        , STARTF_USESTDHANDLES := 0x100, CREATE_NO_WINDOW := 0x08000000
   
   DllCall("CreatePipe", "PtrP", hPipeRead, "PtrP", hPipeWrite, "Ptr", 0, "UInt", 0)
   DllCall("SetHandleInformation", "Ptr", hPipeWrite, "UInt", flags, "UInt", HANDLE_FLAG_INHERIT)
   
   VarSetCapacity(STARTUPINFO , siSize :=    A_PtrSize*4 + 4*8 + A_PtrSize*5, 0)
   NumPut(siSize              , STARTUPINFO)
   NumPut(STARTF_USESTDHANDLES, STARTUPINFO, A_PtrSize*4 + 4*7)
   NumPut(hPipeWrite          , STARTUPINFO, A_PtrSize*4 + 4*8 + A_PtrSize*3)
   NumPut(hPipeWrite          , STARTUPINFO, A_PtrSize*4 + 4*8 + A_PtrSize*4)
   
   VarSetCapacity(PROCESS_INFORMATION, A_PtrSize*2 + 4*2, 0)

   if !DllCall("CreateProcess", "UInt", 0, "Str", sCmd, "UInt", 0, "UInt", 0, "UInt", true, "UInt", CREATE_NO_WINDOW
                              , "UInt", 0, "UInt", 0, "Ptr", &STARTUPINFO, "Ptr", &PROCESS_INFORMATION)
   {
      DllCall("CloseHandle", "Ptr", hPipeRead)
      DllCall("CloseHandle", "Ptr", hPipeWrite)
      throw Exception("CreateProcess is failed")
   }
   DllCall("CloseHandle", "Ptr", hPipeWrite)
   VarSetCapacity(sTemp, 4096), nSize := 0
   while DllCall("ReadFile", "Ptr", hPipeRead, "Ptr", &sTemp, "UInt", 4096, "UIntP", nSize, "UInt", 0) {
      sOutput .= stdOut := StrGet(&sTemp, nSize, encoding)
      ( callBackFuncObj && callBackFuncObj.Call(stdOut) )
   }
   DllCall("CloseHandle", "Ptr", NumGet(PROCESS_INFORMATION))
   DllCall("CloseHandle", "Ptr", NumGet(PROCESS_INFORMATION, A_PtrSize))
   DllCall("CloseHandle", "Ptr", hPipeRead)
   Return sOutput
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

3

Re: AHK: запуск консоли в фоновом режиме

Спасибо,  работает.

Modbus - это протокол коммуникаци оборудования над RS-485, по архитектуре Master/Slave. В основном используется в промышленности, но и в умных домах тоже.
Modpoll - comand line утилита для Modbus. Единственное, что пока нашел свободного и совместимого с АНК.