1. 程式人生 > >VB中執行一個EXE檔案,並對EXE視窗的控制元件進行操作

VB中執行一個EXE檔案,並對EXE視窗的控制元件進行操作

1,執行一個EXE程式 
  1. Dim   mProcID   AsLong
  2. mProcID   =   Shell(FileName)
2,把這個EXE程式關閉掉
  1. Option   Explicit  
  2. Const   PROCESS_QUERY_INFORMATION   =   &H400  
  3. Const   PROCESS_TERMINATE   =   &H1  
  4. PrivateDeclareFunction   OpenProcess   Lib"kernel32"   (ByVal   dwDesiredAccess   AsLong,   ByVal   bInheritHandle   AsLong,   
    ByVal   dwProcessId   AsLong)   AsLong
  5. PrivateDeclareFunction   CloseHandle   Lib"kernel32"   (ByVal   hObject   AsLong)   AsLong
  6. PrivateDeclareFunction   TerminateProcess   Lib"kernel32"   (ByVal   hProcess   AsLong,   ByVal   uExitCode   AsLong)   AsLong
  7. Sub   main()  
  8. Dim   mProcID   AsLong
  9. Dim   hProcess     
    AsLong
  10.            mProcID   =   Shell("notepad.exe",   1)   '此處利用了   Shell當函式使用時返回的任務標識  
  11.            hProcess   =   OpenProcess(PROCESS_TERMINATE   Or   PROCESS_QUERY_INFORMATION,False,mProcID)  
  12. Call   TerminateProcess(hProcess,   3838)  
  13. EndSub
OpenProcess()的第一個叄數,指的是所取得的hProcess所具有的能力,像PROCESS_QUERY_INFORMATION   便是讓GetExitCode()可取得hProcess所指的process之狀態,而PROCESS_TERMINATE,便是讓 TerminateProcess(hProcess..)的指令能夠生效,也就是說,不同叄數設定,使hProcess所具有的許可權、能力有所不同。
    本例子將第一個引數設為PROCESS_TERMINATE   Or   PROCESS_QUERY_INFORMATION都可。
3,通過API函式SendMessage傳送一個WM_CLOSE訊息,關閉當前EXE視窗    
  1. Private
    Const WM_CLOSE = &H10
  2. PrivateDeclareFunction FindWindow Lib"user32"Alias"FindWindowA" (ByVal lpClassName As Any, ByVal lpWindowName AsStringAsLong
  3. PrivateDeclareFunction SendMessage Lib"user32"Alias"SendMessageA" (ByVal hwnd AsLongByVal wMsg AsLongByVal wParam AsLong, lParam As Any) AsLong
  4. hwnd = FindWindow(0&, "搜尋視窗的標題Title"
  5. Call SendMessage(hwnd,WM_CLOSE, 0,ByVal 0&
4,通過模擬點選滑鼠左鍵,點選畫面關閉按鈕
  1. PrivateDeclareFunction   SendMessage   Lib"user32"Alias"SendMessageA"   (ByVal   hwnd   AsLong,   ByVal   wMsg   AsLong,   ByVal   wParam   AsLong,   lParam   As   Any)   AsLong
  2. PrivateDeclareFunction   FindWindow   Lib"user32"Alias"FindWindowA"   (ByVal   lpClassName   AsString,   ByVal   lpWindowName   AsString)   AsLong
  3. PrivateDeclareFunction   FindWindowEx   Lib"user32"Alias"FindWindowExA"   (ByVal   hWnd1   AsLong,   ByVal   hWnd2   AsLong,   ByVal   lpsz1   AsString,   ByVal   lpsz2   AsString)   AsLong
  4. PrivateConst BM_CLICK = &HF5
  5. Dim fw as Long
  6. Dim hWnd as Long
  7.   fw   =   FindWindow(vbNullString,   "視窗標題Title")  
  8.    hWnd   =   FindWindowEx(fw,   0,   "Button類名OR 0",   Button的Caption)  
  9.    SendMessage   hWnd,   BM_CLICK,   0,   ByVal 0& 
   這段例子在VB6.0的IDE中Debug時,有可能會出現下列錯誤,直接無視之,只要編譯成EXE後,就不存在這個問題了,IDE的Bug

Err: -2147417843 - Automation Error : An Out Going Call Cannot Be Made Because The Application Is Dispatching An Input Asynchronous Call

5,在實驗過程中用到的幾個API,也分享一下
  1. DeclareFunction GetClassName Lib"user32.dll"Alias"GetClassNameA" _
  2. (ByVal hWnd AsLongByVal lpClassName AsStringByVal nMaxCount AsLongAsLong
  3. DeclareFunction GetWindowText Lib"user32"Alias"GetWindowTextA" ( _
  4. ByVal hWnd AsLong, _
  5. ByVal sWndTitle AsString, _
  6. ByVal cLen AsLongAsLong
  7. DeclareFunction ShowWindow Lib"user32.dll"  _
  8.     (ByVal hWnd AsLongByVal nCmdShow AsLongAsLong
  9. DeclareSub Sleep Lib"kernel32.dll" _
  10.         (ByVal dwMillsecounds AsLong)
  11. PrivateConst SW_RESTORE = &H9
  12. PrivateConst BM_CLICK = &HF5
  13. Dim hWnd AsLong
  14. Dim hWndBtn AsLong
  15. Dim temp AsString
  16. hWnd = FindWindow(vbNullString, "視窗標題Title")
  17. Call ShowWindow(hWnd, SW_RESTORE) '視窗活性化
  18. hWndBtn = FindWindowEx(hWnd, 0&, 0&, "按鈕的Caption")
  19. temp = String(256, Chr(0))
  20. Call GetClassName(hWndBtn, temp, 256)  '可以檢視物件類名
  21. temp = String(256, Chr(0))
  22. Call GetWindowText(hWndBtn, temp, 256) '可以檢視物件Caption
  23. Call SendMessage(hWndBtn, BM_CLICK, 0, ByVal 0&)
參考的資料網址
帖子 
如何關閉Shell開啟的視窗?
http://topic.csdn.net/t/20040804/14/3241643.html
帖子  用sendmessage實現自動點選指定視窗中的指定按鈕的問題
http://topic.csdn.net/t/20040819/03/3288355.html
用FindWindowEx找不到我要的Button,但EnumChildWindows可以遍歷到它???
http://topic.csdn.net/t/20060823/13/4969697.html