1. 程式人生 > >獲取開啟的文件的路徑

獲取開啟的文件的路徑

; File encoding:  UTF-8 
/*
AutoHotkey 版本: 1.1.9.0
作業系統:    Windows XP/Vista/7 
作者:        sunwind <1576157 qq="" com=""> 
部落格:        http://blog.csdn.net/liuyukuan/article/details/7411291
指令碼說明:此為指令碼用於開啟Office、Scite等軟體中 開啟的文件路徑。
指令碼版本:   2012-12-23版
Timestamp:2012年12月23日14:40:22
*/
 

;2012-12-23 更新Scite路徑獲取方式為com呼叫,即使標題欄沒有顯示全部路徑也能工作。
;2012-03-31 改熱鍵為win+del,因為我多數是為了清理沒用文件,刪除當前開啟的檔案。  
;2012-03-31 增加:對非office軟體 則開啟程式所在目錄功能。
;2012-03-31 增加 :可開啟SciTE 、EmEditor文件所在目錄(前提是其標題欄顯示文件路徑)

;對於notepad等程式需要增加也個case標籤單獨處理,可以通過先設定各個程式支援在標題欄中顯示路徑,然後解析路徑的方式.本想弄個通用的用WMI方式查詢cmd_line內容,但是如果運行了記事本,再open,開啟文字檔案的話,檔案路徑是不在cmd_line中的,殘念.  


#del:: ;開啟office文件所在目錄。非office軟體開啟程式所在目錄。
  WinGet, _ProcessPath, ProcessPath, A
  _DocPath:=getDocumentPath(_ProcessPath)
  TrayTip,,%_DocPath%,10
  Run,% "Explorer.exe /select, " _DocPath 
Return


getDocumentPath(_ProcessPath)
  {
	SplitPath,_ProcessPath,Process_Name,Process_Dir,,Process_NameNoExt
	value:=Process_NameNoExt
	
    If IsLabel( "Case_" . value)
        Goto Case_%value%
    Else
        Goto Case_Default
Case_WINWORD:  ;Word OpusApp
  Application:= ComObjActive("Word.Application") ;word
  ActiveDocument:= Application.ActiveDocument ;ActiveDocument
Return  % ActiveDocument.FullName
Case_EXCEL:  ;Excel XLMAIN
  Application := ComObjActive("Excel.Application") ;excel
  ActiveWorkbook := Application.ActiveWorkbook ;ActiveWorkbook
Return % ActiveWorkbook.FullName
Case_POWERPNT:  ;Powerpoint PPTFrameClass
  Application:= ComObjActive("PowerPoint.Application") ;Powerpoint
  ActivePresentation := Application.ActivePresentation ;ActivePresentation
Return % ActivePresentation.FullName

Case_SciTE:       ;;開啟SciTE當前檔案所在目錄
Return % GetCurrentFilePath(GetSciTEInstance())
Case_EmEditor:  ;;開啟EmEditor當前檔案所在目錄 
	WinGetActiveTitle _Title
	SplitPath,_Title,name,dir
	Needle:=" - "
	StringSplit,_name,name,%Needle%
	FullName:=dir . "\" . _name1
Return % FullName
Case_AkelPad:
    WinGetActiveTitle _Title
	SplitPath,_Title,name,dir
    MsgBox %dir%
	Needle:=" - "
	StringSplit,_name,name,%Needle%
	FullName:=dir . "\" . _name1
Return % FullName

Case_Notepad:
 WinGet pid, PID, A
  wmi := ComObjGet("winmgmts:")
  queryEnum := wmi.ExecQuery(""
  . "Select * from Win32_Process where ProcessId=" . pid)
  ._NewEnum()
  If queryEnum[Process] {
       CMDLine := Process.CommandLine ; 獲取程序命令列
       RegExMatch(CMDLine, "i)\s+(.*)", ff_)   ; 正則匹配命令列引數
        ;~ RegExMatch(process.CommandLine,"i).*exe.*?\s+(.*)",CMDLine_1)
       StringReplace,ff,ff_1,`",,All
       if ff<>
         Return % ff
       else
        Return % _ProcessPath
       wmi := queryEnum := Process := ""
    }
    
Case_Default:
Return % _ProcessPath ; 其他程式開啟程式所在目錄
}


GetCurrentFilePath(scite)
{
	if !scite
	{
		MsgBox, 16, Error, Can't find SciTE!
		ExitApp
	}
	return scite.CurrentFile
}
GetSciTEInstance()
{
	olderr := ComObjError()
	ComObjError(false)
	scite := ComObjActive("SciTE4AHK.Application")
	ComObjError(olderr)
	return IsObject(scite) ? scite : ""
}
;~ 增加開啟當前程式的路徑,熱鍵設定為win+end。 

#end:: ;僅是開啟當前啟用視窗的程式所在目錄。不常用
  WinGet, _ProcessPath, ProcessPath, A
  Run,% "Explorer.exe /select, " _ProcessPath 
Return