|
VFP 愛用者社區 本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
|
上一篇主題 :: 下一篇主題 |
發表人 |
內容 |
garfield Site Admin
註冊時間: 2003-01-30 文章: 2157
第 1 樓
|
發表於: 星期四 十二月 23, 2004 11:32 am 文章主題: 執行程式後, 在一段時間後將該程式關閉, 隔3秒再進入一次, 一直到你手動將該程式關閉為止 |
|
|
這個程式是自己有如主題所說的需求而寫的, 一些程式碼用 google 找到的來改寫, 網路上寶藏還真多 ^o^
代碼: |
LPARA mexename , pcTitle , mbtncaption , mInterval , mwaitime
* 請將這個程式編輯成執行檔, 假設這個執行檔名為timerun
* 然後建立一個捷徑 , timerun 你要自動定時執行的程式 該程式的caption 要結束該程式時要按的按鈕之caption 執行檔在幾秒後會自動關閉 等待下一次執行的秒數
if !empty( minterval ) &&--利用傳參數來的方式 來限定時間
minterval = val( minterval )
else
mInterval = 60*60 &&--內定是 60 分鐘結束程式再進入一次.
endif
if empty( mwaitime )
mwaitime = 3
else
mwaitime = val( mwaitime ) &&--利用傳參數來的方式 來設定關閉程式後的間隔時間
endif
* mInterval=1
Declare INTEGER FindWindow IN user32;
STRING lpClassName,;
STRING lpWindowName
Declare INTEGER FindWindowEx IN user32;
INTEGER hwndParent, ;
INTEGER hwndChildAfter, ;
STRING lpszClassName, ;
STRING lpszWindowCaption
Declare INTEGER SendMessage IN user32;
INTEGER hWnd,;
INTEGER Msg,;
INTEGER wParam,;
INTEGER lParam
_screen.WindowState = 1 &&--將本程式縮到最小
oWS = CreateObject("WScript.Shell")
do while .t.
*ocall = oWS.Exec(mexename+".exe")
ocall = oWS.run( mexename+".exe",2,.F.) &&-因為用exec 會造成 中斷目前的程式, 而跳到 callerid.exe 的視窗, 所以才改用 run
*mprocessid = ocall.ProcessID
*mtime = 0
for i=1 to mInterval
minkey = inkey( 1 ) &&--1秒檢查一次是否自己將要定時執行的程式關閉了.
wndDialog = FindWindow( 0, pcTitle )
if minkey=27
if wndDialog > 0
closewindow(pcTitle , mbtncaption )
endif
quit
endif
if wndDialog = 0 &&-- 目前沒有在執行中, 就直接離開
quit
endif
next
*if wndDialog > 0 &&-- 目前沒有在執行中, 就直接離開
closewindow(pcTitle ,mbtncaption ) &&--送 keyboard 0 有時會有問題.
*endif
inkey( mwaitime )
enddo
quit
************************
Procedure CloseWindow
Lparameters pcTitle, pcButtonCaption
#Define WM_COMMAND 0x0111
#Define WM_LBUTTONDOWN 0x0201
#Define WM_LBUTTONUP 0x0202
wndDialog = FindWindow( 0, pcTitle )
wndButton = 0
local mret
mret = 0
If wndDialog > 0
* Sometimes Message WM_COMMAND 0x00110818 isn't enough,
* if you MUST click "Cancel" or "Yes", etc
* then provide a button caption
If VarType(pcButtonCaption)='C'
wndButton = FindWindowEx( wndDialog, 0, 'Button', ;
pcButtonCaption )
If wndButton > 0
*!* SendMessage(wndButton, WM_LBUTTONDOWN, 1, 0x00120025 )
*!* SendMessage(wndButton, WM_LBUTTONUP, 0, 0x00120025 )
*!* * Button Clicked message
*!* SendMessage(wndDialog, WM_COMMAND, 3, wndButton )
mret = SendMessage(wndDialog, WM_COMMAND, 1, wndButton ) &&--用這個就可以離開了.
Endif
Endif
*mret = SendMessage(wndDialog, WM_COMMAND, 1, 0x00110818 )
Endif
Return mret=1
|
_________________ 利用>>搜尋<<的功能會比問的還要快得到答案. |
|
回頂端 |
|
|
bin1x
註冊時間: 2004-08-27 文章: 462
第 2 樓
|
發表於: 星期四 十二月 23, 2004 11:47 am 文章主題: |
|
|
Lpara 這樣帶
是否如同命令列引數一般的用法
可是為什麼要用
lpara
para不能用嗎?
如果是區域變數
priv 不就可以用了
有點疑問,請指教一下
且在程式中
mexename 的值沒有被assign
這也是疑問?
假設執行檔是test1.exe
是否應這樣帶,或是......?
c:\>test1 test1 |
|
回頂端 |
|
|
garfield Site Admin
註冊時間: 2003-01-30 文章: 2157
第 3 樓
|
發表於: 星期四 十二月 23, 2004 1:32 pm 文章主題: |
|
|
lpara 跟 para 差別在於 lpara 接受參數的變數名稱只會在這個自定函數只使用, 也就等於使用 local 變數
mexename 是在執行時給的, 所以我假設這個程式在編輯成執行檔時的名稱叫timerun , 而你要定時執行的程式是 test1.exe 那用法是
c:\>timerun test1 該程式的caption 要結束該程式時要按的按鈕之caption 3600 3
這樣timerun會自動執行test1.exe 且在3600秒後, 自動按test1.exe的結束按鈕, 再等3秒鐘又再一次自動執行test1.exe , 一直到你自己手動按test1.exe的結束按鈕時再關閉timerun.
我會寫這個程式是因為我有一個別人寫的程式不穩定,而我又沒辨法修改它, 只好寫一個程式來定時關閉它再自動執行它. _________________ 利用>>搜尋<<的功能會比問的還要快得到答案. |
|
回頂端 |
|
|
|
|
您 無法 在這個版面發表文章 您 無法 在這個版面回覆文章 您 無法 在這個版面編輯文章 您 無法 在這個版面刪除文章 您 無法 在這個版面進行投票 您 無法 在這個版面附加檔案 您 無法 在這個版面下載檔案
|
|