AutoHotkey Homepage AutoHotkey Community
Let's help each other out
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Console application with ahk

 
Post new topic   Reply to topic    AutoHotkey Community Forum Index -> Scripts & Functions
View previous topic :: View next topic  
Author Message
ahklerner



Joined: 26 Jun 2006
Posts: 1209
Location: USA

PostPosted: Sun Apr 13, 2008 11:23 pm    Post subject: Console application with ahk Reply with quote

Credits:
Thanks to Lexikos for a simple demonstration.
Thanks to Huba for this post http://www.autohotkey.com/forum/viewtopic.php?t=18550 . I changed the names of the functions only to make them stdlib compatible.

Code:
;Init the console
Console_Init()
Console_Write("Autohotkey Command Line Application Test`n")
Console_Write("----------------------------------------`n")
Console_Write("`n")
Console_Write("Welcome " . A_UserName . ". The Current Time is: " . A_Hour . ":" . A_Min . "`n")
Console_Write("What would you like to do today?`n")
ToDo := Console_GetUserInput()
Console_Write("Today you want to " . ToDo . ".`n")

Loop, 5
   {
   Console_Write("Exiting in " . 6 - A_Index . " seconds.`n")
   Sleep, 1000
   }
   
ExitApp

Console_Init(){
   if !(Process_GetModuleFileNameEx(Process_GetCurrentParentProcessID()) = COMSPEC)
      {
      ;MsgBox % "Parent process is not '" . GetFileName(COMSPEC) . "'. The script will now be restarted.`nParent process name : " . Process_GetProcessName(Process_GetCurrentParentProcessID()) . "`nShould be: " . GetFileName(COMSPEC)
      If A_IsCompiled
         Run %comspec% /c ""%A_ScriptFullPath%"", , Hide
      else
         Run %comspec% /c ""%A_AhkPath%" "%A_ScriptFullPath%"", , Hide
      ExitApp
      }
   DllCall("AllocConsole")
   }

Console_Write(txt){
   FileAppend, %txt%, con
   }

Console_GetUserInput(){
   FileReadLine, l, con, 1
   return l
   }
   
GetFileName(pFile){
Loop %pFile%
   Return A_LoopFileName
   }

; ProcessInfo.ahk - Function library to retrieve various application process informations:
; - Script's own process identifier
; - Parent process ID of a process (the caller application)
; - Process name by process ID (filename without path)
; - Thread count by process ID (number of threads created by process)
; - Full filename by process ID (GetModuleFileNameEx() function)
;
; Tested with AutoHotkey 1.0.46.10
;
; Created by HuBa
; Contact: http://www.autohotkey.com/forum/profile.php?mode=viewprofile&u=4693
;
; Portions of the script are based upon the GetProcessList() function by wOxxOm
; (http://www.autohotkey.com/forum/viewtopic.php?p=65983#65983)

Process_GetCurrentProcessID(){
  Return DllCall("GetCurrentProcessId")  ; http://msdn2.microsoft.com/ms683180.aspx
}

Process_GetCurrentParentProcessID(){
  Return Process_GetParentProcessID(Process_GetCurrentProcessID())
}

Process_GetProcessName(ProcessID){
  Return Process_GetProcessInformation(ProcessID, "Str", 260, 36)  ; TCHAR szExeFile[MAX_PATH]
}

Process_GetParentProcessID(ProcessID){
  Return Process_GetProcessInformation(ProcessID, "UInt *", 4, 24)  ; DWORD th32ParentProcessID
}

Process_GetProcessThreadCount(ProcessID){
  Return Process_GetProcessInformation(ProcessID, "UInt *", 4, 20)  ; DWORD cntThreads
}

Process_GetProcessInformation(ProcessID, CallVariableType, VariableCapacity, DataOffset){
  hSnapshot := DLLCall("CreateToolhelp32Snapshot", "UInt", 2, "UInt", 0)  ; TH32CS_SNAPPROCESS = 2
  if (hSnapshot >= 0)
  {
    VarSetCapacity(PE32, 304, 0)  ; PROCESSENTRY32 structure -> http://msdn2.microsoft.com/ms684839.aspx
    DllCall("ntdll.dll\RtlFillMemoryUlong", "UInt", &PE32, "UInt", 4, "UInt", 304)  ; Set dwSize
    VarSetCapacity(th32ProcessID, 4, 0)
    if (DllCall("Process32First", "UInt", hSnapshot, "UInt", &PE32))  ; http://msdn2.microsoft.com/ms684834.aspx
      Loop
      {
        DllCall("RtlMoveMemory", "UInt *", th32ProcessID, "UInt", &PE32 + 8, "UInt", 4)  ; http://msdn2.microsoft.com/ms803004.aspx
        if (ProcessID = th32ProcessID)
        {
          VarSetCapacity(th32DataEntry, VariableCapacity, 0)
          DllCall("RtlMoveMemory", CallVariableType, th32DataEntry, "UInt", &PE32 + DataOffset, "UInt", VariableCapacity)
          DllCall("CloseHandle", "UInt", hSnapshot)  ; http://msdn2.microsoft.com/ms724211.aspx
          Return th32DataEntry  ; Process data found
        }
        if not DllCall("Process32Next", "UInt", hSnapshot, "UInt", &PE32)  ; http://msdn2.microsoft.com/ms684836.aspx
          Break
      }
    DllCall("CloseHandle", "UInt", hSnapshot)
  }
  Return  ; Cannot find process
}

Process_GetModuleFileNameEx(ProcessID)  ; modified version of shimanov's function
{
  if A_OSVersion in WIN_95, WIN_98, WIN_ME
    Return Process_GetProcessName(ProcessID)
 
  ; #define PROCESS_VM_READ           (0x0010)
  ; #define PROCESS_QUERY_INFORMATION (0x0400)
  hProcess := DllCall( "OpenProcess", "UInt", 0x10|0x400, "Int", False, "UInt", ProcessID)
  if (ErrorLevel or hProcess = 0)
    Return
  FileNameSize := 260
  VarSetCapacity(ModuleFileName, FileNameSize, 0)
  CallResult := DllCall("Psapi.dll\GetModuleFileNameExA", "UInt", hProcess, "UInt", 0, "Str", ModuleFileName, "UInt", FileNameSize)
  DllCall("CloseHandle", hProcess)
  Return ModuleFileName
}

_________________
Back to top
View user's profile Send private message
Wouther



Joined: 01 May 2007
Posts: 78
Location: The Netherlands

PostPosted: Wed Apr 16, 2008 3:27 pm    Post subject: Reply with quote

Can you read my mind? Shocked This is exactly what I was looking for! Thank you very much! Very Happy
Edit: If I run it from the command prompt, it opens a new window. Is it possible to write text to / get input from an already existing command prompt window, from which you called the script?
_________________
Printing css/html-formatted text
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    AutoHotkey Community Forum Index -> Scripts & Functions All times are GMT
Page 1 of 1

 
Jump to:  
You can post new topics in this forum
You can reply to topics in this forum


Powered by phpBB © 2001, 2005 phpBB Group