VFP 愛用者社區 首頁 VFP 愛用者社區
本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
 
 常見問題常見問題   搜尋搜尋   會員列表會員列表   會員群組會員群組   會員註冊會員註冊 
 個人資料個人資料   登入檢查您的私人訊息登入檢查您的私人訊息   登入登入

請問如何在 VFP 中執行捷徑

 
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區
上一篇主題 :: 下一篇主題  
發表人 內容
cool



註冊時間: 2003-05-17
文章: 47


第 1 樓

發表發表於: 星期六 五月 17, 2003 4:40 pm    文章主題: 請問如何在 VFP 中執行捷徑 引言回覆

請問各位先進
可否在 VFP 中呼叫建立在 WINDOWS 中的捷徑
試過用 RUN 命令但不行
回頂端
檢視會員個人資料 發送私人訊息
Ruey



註冊時間: 2003-03-12
文章: 1698
來自: tunglo

第 2 樓

發表發表於: 星期三 五月 21, 2003 1:31 am    文章主題: 引言回覆

請問一下你會何要如此做
_________________
#############################
快樂媽咪系列幸福宅配,喝十全雞湯~原來幸福那麼簡單!!

學會VFP使用者社區的搜尋,Code才會更有趣~
#############################
回頂端
檢視會員個人資料 發送私人訊息
cool



註冊時間: 2003-05-17
文章: 47


第 3 樓

發表發表於: 星期三 五月 21, 2003 8:50 am    文章主題: 引言回覆

您好 Ruey

我是要呼叫 Photoimpact 來編輯圖檔
但遇到兩個問題
其一
Photoimpact 的執行檔在
C:\Program Files\Ulead Systems\Ulead PhotoImpact 6\Iedit.exe
但其路徑隨安裝不同而不同
其二
在 VFP 中要如何控制編輯圖檔存放的內定資料夾

因此想,如果先設一個捷徑放在 VFP 預設路徑中
並設定捷徑的開始位置
只要呼叫該捷徑即可一次解決

不知是否可行,或另有方法
請不吝賜教
謝謝
回頂端
檢視會員個人資料 發送私人訊息
Ruey



註冊時間: 2003-03-12
文章: 1698
來自: tunglo

第 4 樓

發表發表於: 星期三 五月 21, 2003 12:19 pm    文章主題: 引言回覆

在VFP中調用其他應用程式的實用技術(轉貼)

在用VFP進行應用程式設計中,經常需要調用其他的應用程式。這時候我們立即會想到RUN命令。使用RUN命令只需知道應用程式的檔案名及其路徑即可。
---- 下面的示例是以最大化方式啟動Windows目錄下的圖畫板程式並同時打開c:\windows\Bubbles.bmp 文件:
---- RUN/n3 C:\Windows\Pbrush.exe c:\windows\Bubbles.bmp 。RUN命令的參數用法可以參考Visual FoxPro的幫助檔。 但是令人失望的是,在實際開發時我們常常無法確定所需要啟動的應用程式的檔案名及其安裝的路徑。比如我們需要啟動用戶機器上的流覽器並連接到某一個網址,該機器可能安裝的是IE,也可能是NetScape,還有可能是其他的流覽器軟體,安裝的路徑更是無從確定。下面給出我在工作中找到的兩種解決方法,這兩種方法都是通過Win32 API函數來解決問題,因此其解決思路也可以用到其他編程語言中去。
---- (一)從註冊表中獲取被調用軟體的名稱及路徑。
---- 我們只需要提供被調用的軟體所處理的檔類型(由檔副檔名來確定),即可通過查找註冊表中該軟體註冊的可以處理的檔類型的資料項目來得到該軟體的檔案名及安裝路徑 。
*主函數
PROCEDURE lookreg
Parameter filetype && 文件類型
* 申明要用到的API 函數
DECLARE Integer RegOpenKey IN Win32API ;
Integer nHKey, String @cSubKey,
Integer @nResult
DECLARE Integer RegCloseKey IN Win32API ;
Integer nHKey
DECLARE Integer RegQueryvalueEx IN Win32API ;
Integer nHKey, String lpszvalueName,
Integer dwReserved,;
Integer @lpdwType, String @lpbData,
Integer @lpcbData
#DEFINE HKEY_CLASSES_ROOT
-2147483648
#DEFINE C_EXTNOFOUND_LOC "查找失敗!"
LOCAL cExtn,cAppKey,cAppName,nErrNum
LOCAL oReg,regfile
cAppKey = ""
cAppName = ""
nCurrentKey = 0
nErrNum =GetAppPath
(filetype,@cAppKey,@cAppName)
* 確保去掉可執行檔後的參數
(如: C:\EXCEL\EXCEL.EXE /e)
IF ATC(".EXE",m.cAppName) #0
m.cAppName= ALLTRIM(SUBSTR
(m.cAppName,1,ATC(".EXE",m.cAppName)+3))
IF ASC(LEFT(cAppName,1))=34
&& 去掉長檔案名前多出的"字元
m.cAppName = SUBSTR(m.cAppName,2)
ENDIF
ENDIF
Retu LOWER(m.cAppName)
ENDPROC
* 打開註冊表
PROCEDURE OpenKey
LPARAMETER cLookUpKey

LOCAL nSubKey,nErrCode
nSubKey = 0

m.nRegKey = HKEY_CLASSES_ROOT

nErrCode = RegOpenKey
(m.nRegKey,m.cLookUpKey,@nSubKey)
nCurrentKey = m.nSubKey
ENDPROC
* 關閉註冊表
PROCEDURE CloseKey
=RegCloseKey(nCurrentKey)
nCurrentKey =0
ENDPROC
* 查詢註冊表
PROCEDURE GetKeyvalue
LPARAMETER cvalueName,cKeyvalue
LOCAL lpdwReserved,lpdwType,
lpbData,lpcbData,nErrCode
STORE 0 TO lpdwReserved,lpdwType
STORE SPACE(256) TO lpbData
STORE LEN(m.lpbData) TO m.lpcbData
m.nErrCode=RegQueryvalueEx
(nCurrentKey,m.cvalueName,;
m.lpdwReserved,@lpdwType,@lpbData,@lpcbData)
m.cKeyvalue = LEFT(m.lpbData,m.lpcbData-1)
ENDPROC
PROCEDURE GetAppPath
LPARAMETER cExtension,cExtnKey,cAppKey
LOCAL cOptName
cOptName = ""
* 得到要打開的文檔在註冊表中的名稱
=OpenKey("."+m.cExtension)
=GetKeyvalue(cOptName,@cExtnKey)
=CloseKey()
RETURN GetApplication(cExtnKey,@cAppKey)
ENDPROC
* 得到應用程式的安裝路徑及名稱
PROCEDURE GetApplication
PARAMETER cExtnKey,cAppKey
LOCAL cOptName
cOptName = ""

=OpenKey(m.cExtnKey+"\Shell\Open\Command")
=GetKeyvalue(cOptName,@cAppKey)
=CloseKey()
ENDPROC
---- 在使用這段程式時,使用如下格式的語句:
---- fullpath=lookreg("doc") && 返回打開doc 檔的軟體名及安裝路徑
---- 靈活運用該段程式,可以大大豐富我們在軟體中的表現能力,例如應用軟體的功能表中都有一項“關於本軟體”的功能,該功能調用的表單一般用來顯示有關系統資源及軟體版權的資訊。如果我們要給其中的公司資訊加上超文本鏈結使其可以直接訪問公司主頁。就可以在顯示公司資訊的 Label控制項的 Click 事件中使用如下語句:
fullpath=lookreg("htm")
If allt(fullpath)= =[]
=messagebox(" 無法找到流覽器以
流覽公司主頁!",64,"")
retu
Else
fullpath=subst(fullpath,1,rat
([.],fullpath)-1)+space(2)+;
[www.flysmart.com]
RUN/n3 &fullpath
Endif
---- (二)利用Windows 的文檔關聯特性直接調用。
---- 我們知道,Windows是一種面向文檔的作業系統。當我們雙擊某個檔時,Windows就會自動啟動與該檔相關聯的應用程式來對檔進行處理。在這個過程中Windows主要使用了一個名為ShellExecute 的Win32 API函數。我們可以通過這個函數來直接調用其他程式,徹底拋棄Run 命令的方式。
Function shellstart
Parameters documentname
* 聲明ShellExecute函數
DECLARE INTEGER ShellExecute IN
shell32.DLL INTEGER HWND,;
STRING lpszOP, ;
STRING lpszFile, ;
STRING lpszParams, ;
STRING lpszDir, ;
INTEGER fsshowcmd
* 指定ShellExecute函數的輸出指向Windows桌面
DECLARE INTEGER GetDesktopWindow IN win32api
HWND = GetDesktopWindow()
* 指定操作命令為"打開"方式
lpszOP = "open"
* 指定ShellExecute操作的物件為 documentname
lpszFile = documentname
lpszParams = ""
* 指定ShellExecute的缺省目錄為c:\temp
lpszDir = "c:\temp"
fsshowcmd = 0
* 執行ShellExecute命令
LNRETURN = ShellExecute(HWND, lpszOP,
lpszFile, lpszParams, lpszDir,fsshowcmd)
Retu
調用方式:
=shellstart("www.flysmart.com")
&& 連接到網站www.flysmart.com
=shellstart(“c:\windows\script.doc”)
&& 打開c:\windows\script.doc文件
回頂端
檢視會員個人資料 發送私人訊息
Ruey



註冊時間: 2003-03-12
文章: 1698
來自: tunglo

第 5 樓

發表發表於: 星期三 五月 21, 2003 1:09 pm    文章主題: 引言回覆

利用Windows特性,檔案關聯方式
安裝PhotoImpact記得要關聯
缺點是PhotoImpact沒有關聯時,會用預設軟件
PUBLIC gCom_ImagePath &&圖檔存放的內定資料夾的變數


lcPathImages=ALLTRIM(mgCom_ImagePath)

*SET STEP ON

lcFile=lcPathImages+'\*.*'


IF ALLTRIM(THISFORM.ImgFile)=""
ShowMsg("無此檔案或未選定檔案!!") &&警告訊息
RETURN
ENDIF

=shellstart(lcPathImages+"\"+ALLTRIM(THISFORM.ImgFile) )
cc=LEN(ALLTRIM(THISFORM.ImgFile))-RAT(".",ALLTRIM(THISFORM.ImgFile))+1

FULLPATH=lookreg(SUBSTR(ALLTRIM(THISFORM.ImgFile),RAT(".",ALLTRIM(THISFORM.ImgFile))+1,3))
IF ALLT(FULLPATH)==""
ShowMsg("無法找軟體去編輯此文件!")
RETU
ELSE
FULLPATH=SUBST(FULLPATH,1,RAT([.],FULLPATH)-1)+SPACE(2)+;
+lcPathImages+"\"+ALLTRIM(THISFORM.ImgFile)

*strRun="RUN/n3 ["+FULLPATH+"]"
*&strRun
*RUN/n3 &FULLPATH
ENDIF




Function shellstart
Parameters documentname
* 聲明ShellExecute函數
DECLARE INTEGER ShellExecute IN
shell32.DLL INTEGER HWND,;
STRING lpszOP, ;
STRING lpszFile, ;
STRING lpszParams, ;
STRING lpszDir, ;
INTEGER fsshowcmd
* 指定ShellExecute函數的輸出指向Windows桌面
DECLARE INTEGER GetDesktopWindow IN win32api
HWND = GetDesktopWindow()
* 指定操作命令為"打開"方式
lpszOP = "open"
* 指定ShellExecute操作的物件為 documentname
lpszFile = documentname
lpszParams = ""
* 指定ShellExecute的缺省目錄為c:\temp
lpszDir = "c:\temp"
fsshowcmd = 0
* 執行ShellExecute命令
LNRETURN = ShellExecute(HWND, lpszOP,
lpszFile, lpszParams, lpszDir,fsshowcmd)
Retu
回頂端
檢視會員個人資料 發送私人訊息
garfield
Site Admin


註冊時間: 2003-01-30
文章: 2158


第 6 樓

發表發表於: 星期三 五月 21, 2003 7:25 pm    文章主題: 引言回覆

試看看我這個方法看看是否可行, 先找到應用軟體的安裝路徑, 再來RUN
******************************
* 作者: garfield
* 用法: mret = ["]+exepathreg( 'winzip.exe' )+["] &&--請注意並不一定所有的應用軟體皆可以偵測的出來, 加上" 是為了避免程式路徑中有空白字, 也可使用 ShellExecute 來執行.
* if isnull( mret )
* messagebox('winZip Not Install')
* else
* run /n &mret
* &&-- Windows-based application有些必須在 run 後再上 /n 才可RUN正確.
* endif

func exepathreg
lpara mexename
#Define HKEY_LOCAL_MACHINE -2147483646
return readregs(HKEY_Local_machine, 'Software\Microsoft\windows\CurrentVersion\App Paths\'+mexename+'\' ,'' )
******************************
**************************************************
*** 讀取字串值 ReadRegistryString
*** 傳回值:字串或.NULL.表無此機碼
**************************************************
Func ReadRegs
LPARAMETERS HKey, Subkey, Entry
LOCAL nHandle, nResult, nSize, cDataBuffer, nType
nHandle=0

#Define ERROR_SUCCESS 0

Declare INTEGER RegOpenKey IN Win32API INTEGER nHKey,STRING cSubKey,INTEGER @nHandle
*//開啟機碼
nResult=RegOpenKey(HKey,SubKey,@nHandle)
IF nResult#ERROR_SUCCESS
RETURN .NULL.
ENDIF

*// 使用RegQueryValueEx決定資料型態
DECLARE INTEGER RegQueryValueEx IN Win32API INTEGER nHKey,;
STRING lpszValueName,INTEGER dwReserved,;
INTEGER @lpdwType, STRING @lpbData, INTEGER @lpcbData

Declare INTEGER RegCloseKey IN Win32API INTEGER nHKey
*//將值傳回 buffer
cDataBuffer=space(256)
nSize=LEN(cDataBuffer)
nType=0
nResult= RegQueryValueEx(nHandle,Entry,0,@nType,@cDataBuffer,@nSize)
=RegCloseKey(nHandle)

IF nResult#ERROR_SUCCESS
RETURN .NULL.
ENDIF

IF nSize <2
RETURN "" &&//空字串
ENDIF &&//去除空白字元及字串後的 NULL
RETURN SUBSTR(CHRTRAN(cDataBuffer,CHR(0),""),1,nSize-1)

_________________
利用>>搜尋<<的功能會比問的還要快得到答案.


garfield 在 星期五 五月 23, 2003 7:37 am 作了第 2 次修改
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件
cool



註冊時間: 2003-05-17
文章: 47


第 7 樓

發表發表於: 星期三 五月 21, 2003 10:11 pm    文章主題: 引言回覆

謝謝兩位前輩的回答

我試過 shellstart 也可以呼叫捷徑
真是太好用了

謝謝
回頂端
檢視會員個人資料 發送私人訊息
elleryq



註冊時間: 2007-06-21
文章: 768


第 8 樓

發表發表於: 星期四 五月 22, 2003 2:40 am    文章主題: 引言回覆

shellstart 是利用 win32 shellexecute api
裡面實際的運作方式就是去 Registry 裡面找,並呼叫到正確的執行檔,跟garfield使用的方法一樣~~
回頂端
檢視會員個人資料 發送私人訊息 參觀發表人的個人網站
Ruey



註冊時間: 2003-03-12
文章: 1698
來自: tunglo

第 9 樓

發表發表於: 星期四 五月 22, 2003 8:37 pm    文章主題: 引言回覆

1.補充garfield 的程式
#DEFINE ERROR_SUCCESS 0

2.使用run &mret 必須注意到,要編的檔案如果有空白,會有錯誤的...
C:\Program Files\Ulead Systems\Ulead PhotoImpact 7\Iedit D:\My Doc\ACC.JPG

_________________
#############################
快樂媽咪系列幸福宅配,喝十全雞湯~原來幸福那麼簡單!!

學會VFP使用者社區的搜尋,Code才會更有趣~
#############################
回頂端
檢視會員個人資料 發送私人訊息
garfield
Site Admin


註冊時間: 2003-01-30
文章: 2158


第 10 樓

發表發表於: 星期五 五月 23, 2003 7:31 am    文章主題: 引言回覆

Ruey 真的很用心, 已將程式修正.
_________________
利用>>搜尋<<的功能會比問的還要快得到答案.
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件
從之前的文章開始顯示:   
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區 所有的時間均為 台北時間 (GMT + 8 小時)
1頁(共1頁)

 
前往:  
無法 在這個版面發表文章
無法 在這個版面回覆文章
無法 在這個版面編輯文章
無法 在這個版面刪除文章
無法 在這個版面進行投票
無法 在這個版面附加檔案
無法 在這個版面下載檔案


Powered by phpBB © 2001, 2005 phpBB Group
正體中文語系由 phpbb-tw 維護製作