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

使用shellexecute 開啟了一個PDF檔案,請問要如何將這個視窗關閉?

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



註冊時間: 2003-09-08
文章: 65
來自: 新竹

第 1 樓

發表發表於: 星期四 九月 17, 2015 2:25 pm    文章主題: 使用shellexecute 開啟了一個PDF檔案,請問要如何將這個視窗關閉? 引言回覆

各位先進好:
我使用了DECLARE INTEGER ShellExecute IN "Shell32.dll" 開啟了一個PDF的文件(列印),想在幕後列印(不用顯示)。
DECLARE INTEGER ShellExecute IN "Shell32.dll" INTEGER hwnd,STRING lpVerb,STRING lpFile,STRING lpParameters,STRING lpDirectory,LONG nShowCmd

ShellExecute(0, "print", LCURL, "", "", 1),已經可以達成,但是列印完之後會留一個視窗,我應該怎樣才可將這個視窗關掉呢?(不是手動關閉),謝謝。
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件
黃澤民



註冊時間: 2003-09-08
文章: 65
來自: 新竹

第 2 樓

發表發表於: 星期五 九月 18, 2015 4:51 pm    文章主題: 找到方法了! 引言回覆

PDF_file = GETFILE('PDF', '選擇或取消', '選擇', 0, '請選擇要開啟的PDF檔')
DO CASE
CASE EMPTY(PDF_file)
Messagebox("並未選擇要開啟的PDF檔",1+32,"訊息視窗")
QUIT
OTHERWISE
*lcUrl = "file://"+PDF_file
lcUrl = PDF_file
oPDF=CREATEOBJECT("wscript.shell")
if VARTYPE(oPDF) <> "O"
= MESSAGEBOX("PDF沒有安裝!",64,"提示")
return
endif
ENDCASE
lcurl1 = '附件20.pdf'
lcurl2 = '附件19.pdf'
*MESSAGEBOX(lcurl)
DECLARE INTEGER ShellExecute IN "Shell32.dll" ;
INTEGER hwnd,STRING lpVerb,STRING lpFile,STRING lpParameters,STRING lpDirectory,LONG nShowCmd
ShellExecute(0, "open", LCURL1, "", "", 1)
MESSAGEBOX('waiting for ...')
ShellExecute(0, "open", LCURL2, "", "", 1)
MESSAGEBOX('Waiting for ...')
? procid('AcroRd32.exe')
? KillProcN('AcroRd32.exe')

FUNCTION ProcList(taProcess)
IF pcount() = 0
RETURN 0
ENDIF
LOCAL laProcess, hSnapShot, lnBufSize, lcProcInfo, lnResult, lnProcID, lnRow
laProcess = taProcess
IF TYPE("&laProcess")="U"
PUBLIC ARRAY &laProcess[1]
ELSE
RELEASE &laProcess
PUBLIC ARRAY &laProcess[1]
ENDIF
DECLARE INTEGER CreateToolhelp32Snapshot IN kernel32 INTEGER dwFlags, INTEGER th32ProcessID
DECLARE INTEGER Process32First IN kernel32 INTEGER hSnapshot, STRING @ lppe
DECLARE INTEGER Process32Next IN kernel32 INTEGER hSnapshot, STRING @ lppe
DECLARE INTEGER CloseHandle IN kernel32 INTEGER hObject
#DEFINE TH32CS_SNAPPROCESS 0x00000002

hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
lnBufSize = 550
lcProcInfo= num2dword(lnBufSize) + REPLICATE(CHR(0), lnBufSize -32)
lnResult = Process32First(hSnapShot, @lcProcInfo)
lnProcID = 0
lnRow = 0
DO WHILE lnResult # 0
lnRow = lnRow + 1
DIMENSION &laProcess[lnRow,5]
&laProcess [lnRow,1] = buf2dword(SUBSTR(lcProcInfo,9,4))
&laProcess [lnRow,2] = buf2dword(SUBSTR(lcProcInfo,21,4))
&laProcess [lnRow,3] = buf2dword(SUBSTR(lcProcInfo,25,4))
&laProcess [lnRow,4] = buf2dword(SUBSTR(lcProcInfo,29,4))
&laProcess [lnRow,5] = STRTRAN(SUBSTR(lcProcInfo,37),CHR(0),"")
lcProcInfo= SUBSTR(lcProcInfo,1,36) +REPLICATE(CHR(0), lnBufSize - 36)
lnResult = Process32Next(hSnapShot, @lcProcInfo)
ENDDO
=CloseHandle(hSnapShot)
RETURN lnRow
ENDFUNC
FUNCTION ProcID(tcProcessName)
IF pcount() = 0
RETURN 0
ENDIF
IF TYPE("tcProcessName") # "C"
RETURN 0
ENDIF
LOCAL lcProcessName, lnBufSize, lcProcInfo, lnResult, lnProcID, th32DefaultHeapID
LOCAL cntUsage, th32ProcessID, th32ModuleID, cntThreads, th32ParentProcessID, pcPriClassBase, dwFlags, szExeFile
lcProcessName = ALLTRIM(tcProcessName)
IF EMPTY(lcProcessName)
RETURN 0
ENDIF
DECLARE INTEGER CreateToolhelp32Snapshot IN Kernel32 INTEGER dwFlags, INTEGER th32ProcessID
DECLARE INTEGER Process32First IN kernel32 INTEGER hSnapshot, STRING @lpPE
DECLARE INTEGER Process32Next IN kernel32 INTEGER hSnapshot, STRING @ lpPE
DECLARE INTEGER CloseHandle IN kernel32 INTEGER hObject
#DEFINE TH32CS_SNAPPROCESS 0x00000002
hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
lnBufSize = 550
lcProcInfo = num2dword(lnBufSize) + REPLICATE(CHR(0), lnBufSize -32)
lnResult = Process32First(hSnapShot, @lcProcInfo)
lnProcID = 0
DO WHILE lnResult # 0
th32ProcessID = buf2dword(SUBSTR(lcProcInfo, 9, 4))
szExeFile = STRTRAN(SUBSTR(lcProcInfo,37), CHR(0), "")
IF ATC(lcProcessName, szExeFile) # 0
lnProcID = th32ProcessID
EXIT && DO WHILE...ENDDO cycle
ENDIF
lcProcInfo= SUBSTR(lcProcInfo,1,36) +REPLICATE(CHR(0), lnBufSize - 36)
lnResult = Process32Next(hSnapShot, @lcProcInfo)
ENDDO
= CloseHandle(hSnapShot)
clear Dlls CreateToolhelp32Snapshot, Process32First, Process32Next, CloseHandle
RETURN lnProcID
ENDFUNC &&ProcID
FUNCTION KillProcID(tnProcID)
IF pcount() = 0
RETURN 0
ENDIF
IF TYPE('tnProcID') # "N"
RETURN 0
ENDIF
LOCAL lnProcID, hProcess, lnResult
IF tnProcID = 0
RETURN 0
ELSE
lnProcID = tnProcID
ENDIF
DECLARE INTEGER OpenProcess IN Kernel32 INTEGER dwDesiredAccess, INTEGER bInheritHandle, INTEGER dwProcId
DECLARE INTEGER TerminateProcess IN Kernel32 INTEGER hProcess, INTEGER uExitCode
DECLARE INTEGER CloseHandle IN Kernel32 INTEGER hObject
#DEFINE PROCESS_TERMINATE 1
hProcess = OpenProcess(PROCESS_TERMINATE, 0, lnProcID)
lnResult = 0
IF hProcess # 0
lnResult = TerminateProcess(hProcess, 0)
ENDIF
= CloseHandle(hProcess)
clear Dlls OpenProcess, TerminateProcess, CloseHandle
RETURN lnResult
ENDFUNC
FUNCTION KillProcN(tcProcessName)
IF pcount() = 0
RETURN 0
ENDIF
LOCAL lnResult
lnResult = KillProcID(ProcID(tcProcessName))
RETURN lnResult
ENDFUNC
FUNCTION Buf2DWORD(tcBuffer)
IF TYPE('tcBuffer') # "C"
RETURN 0
ENDIF
tcBuffer = LEFT(ALLTRIM(tcBuffer), 4)
LOCAL I, lnRet
lnRet = ASC(SUBSTR(tcBuffer, 1, 1))
FOR I = 1 TO 3
lnRet = lnRet + ASC(SUBSTR(tcBuffer, I + 1, 1)) * 256^I
NEXT I
RETURN INT(lnRet)
ENDFUNC
FUNCTION Num2DWORD(tnValue)
#DEFINE m0 256
#DEFINE m1 65536
#DEFINE m2 16777216
LOCAL b0, b1, b2, b3
b3 = INT(tnValue / m2)
b2 = INT((tnValue - b3 * m2) / m1)
b1 = INT((tnValue - b3 * m2 - b2 * m1) / m0)
b0 = MOD(tnValue, m0)
RETURN CHR(b0) + CHR(b1) + CHR(b2) + CHR(b3)
ENDFUNC &&Num2DWORD
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件
ckp6250



註冊時間: 2004-07-30
文章: 1642


第 3 樓

發表發表於: 星期五 九月 18, 2015 5:35 pm    文章主題: 引言回覆

樓上黃大的程式有沒有可能產生一種情況?
因為是用 KillProcN('AcroRd32.exe') 的方式來處理
如果,使用者自己也有手動開著另一個pdf
那麼,這個指令下去時,除了關閉【以 ShellExecute 打開的pdf外 】連同使用者自己手開的 pdf 也一併關掉了。

樓主的目的是希望把【幕後列印(不用顯示)】的關掉,如果連同手動的也關掉,恐怕使用者會有異見。
回頂端
檢視會員個人資料 發送私人訊息 參觀發表人的個人網站
黃澤民



註冊時間: 2003-09-08
文章: 65
來自: 新竹

第 4 樓

發表發表於: 星期五 九月 18, 2015 5:52 pm    文章主題: 引言回覆

嗯!這是有可能的(已經測試過了)。
因為對這一部分不是很熟,所以目前還沒嘗試過其他方法
不過也許可以使用關閉ProcessID的方式來處理(沒試過...)
不知其他先進可以其他方法?
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件
ckp6250



註冊時間: 2004-07-30
文章: 1642


第 5 樓

發表發表於: 星期六 九月 19, 2015 9:09 pm    文章主題: 引言回覆

關於幕後列印pdf,然後把它關閉,而且不要影響使用者手動開啟的pdf
我想有三個方向可以思考
1. Ddeinitiate
2. Createobject( "WScript.Shell" )
3. CreateObject("AcrobatReader.Application")
回頂端
檢視會員個人資料 發送私人訊息 參觀發表人的個人網站
黃澤民



註冊時間: 2003-09-08
文章: 65
來自: 新竹

第 6 樓

發表發表於: 星期日 九月 20, 2015 11:04 am    文章主題: 引言回覆

謝謝你的回應!
我會償試看看。
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件
從之前的文章開始顯示:   
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區 所有的時間均為 台北時間 (GMT + 8 小時)
1頁(共1頁)

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


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