求用VB编程控制外部程序的可行性和详细思路步骤

求用VB编程控制外部程序的可行性和详细思路步骤,第1张

可以实现的

相当于做一个简单的按键精灵,

先通过窗口名字找到这个窗口获取窗口的句柄,然后设置该全窗口的区域,向该窗口发送鼠标信息和键盘信息,就可以模拟点击按钮,选着下拉菜单,以及输入文本的功能。

以下是一个示例:

Private Declare Function FindWindow Lib "user32 " Alias "FindWindowA " (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Private Declare Function GetWindow Lib "user32 " (ByVal hwnd As Long, ByVal wCmd As Long) As Long

Private Declare Function ClientToScreen Lib "user32" (ByVal hWnd As Long, lpPoint As POINTAPI) As Long

Private Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long

Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hWnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long

Private Declare Function GetWindowText Lib "user32 " Alias "GetWindowTextA " (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long

Private Const GW_HWNDNEXT = 2

Private Const GW_HWNDFIRST = 0

Private Declare Function SetWindowText Lib "user32 " Alias "SetWindowTextA " (ByVal hwnd As Long, ByVal lpString As String) As Long

Private Const GW_CHILD = 5

Private Declare Function FindWindowEx Lib "user32 " Alias "FindWindowExA " (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long

Private Declare Function SendMessage Lib "user32 " Alias "SendMessageA " (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

Private Const WM_SETTEXT = &HC

Private Const BN_CLICKED = 0

Private Const bm_click = &HF5

Private Const WM_SETFOCUS = &H7

Private Sub Command1_Click()

Dim h As Long, hChild As Long, i As Long

Dim str As String

’根据程序窗体的标题名字查找程序的句柄

h = FindWindow(vbNullString, "Test ") '得到程序

SendMessage hChild, WM_SETTEXT, 0, ByVal str ’设置文本

SendMessage h, WM_SETFOCUS, 0, 0 ‘设置焦点

SendMessage hChild, bm_click, 0, 0 '点击按钮

end sub

’获取指定的屏幕坐标上的控件的句柄

Private Sub PriCMouseHook_MouseMove(ByVal Button As Long, ByVal mX As Long, ByVal mY As Long)

'鼠标事件通知

Dim tmpStr As String 255, tmpI As Long, tmpJ As Long

Dim tmpStr2 As String

MeCaption = mX & ":" & mY '显示坐标

tmpI = WindowFromPoint(mX, mY)

labHwndCaption = tmpI '取得句柄

tmpJ = GetClassName(tmpI, tmpStr, Len(tmpStr) + 1) '获取类名

If tmpJ > 0 Then

labClassNameCaption = Mid(tmpStr, 1, tmpJ)

End If

If (Button And vbLeftButton) = 1 And InStr(1, labClassNameCaption, "listview", vbTextCompare) > 0 Then

'在这里判断下类名就不会有那个问题了,呵呵果然是注入的问题对别的类也去注入了:)

txtLVItemText = GetLVItemm(tmpI) '获取选中项内容

End If

End Sub

shell不行!

首先你要用搞好路径,如果是和你的程序在同一个程序包内的,要用相对路径,即AppPath 。比如你要打开VB所在路径的abcdoc。那么你可以这样:

Dim xx As String

xx = AppPath & "\" & "abcdoc"

i = ShellExecute(hwnd, "open", xx, vbNullString, vbNullString, 1)

只要在某个事件中加入这个就可以了。

如果不是同一个程序包内,要知道它的路径,用绝对路径。比如C盘的某的文件abcexe

把上面的xx=改为:

xx="c:\abcexe"

就可以了!

提示一下,上面用了API函数。这里不能直接用shell函数,因为shell函数只能直接打开com等等这样的。对于doc等等这样的如果要用shell函数必须要告诉它的关联文件的路径,而对不同的计算机,关联文件的安装是不同的,所以不好实现。而API函数ShellExecute则会自动找到关联文件,并打开。

shell "程序地址"

如果需要用程序打开文件,比如说用播放器打开一个视频文件 那么写成

shell "c:\program files\kmplayer\kmplayerexe d:\movie\1rm"

这样就可用调用kmplayer播放器播放位于d盘 movie文件夹里面的1rm视频文件了

添加timer控件,intervel=30000

在timer事件里写

Call taskkill("xxexe")'如果存在进程xxexe,则结束xxexe

在空白处写

Private Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal dwFlags As Long, ByVal th32ProcessID As Long) As Long

Private Declare Function Process32First Lib "kernel32" (ByVal hSnapshot As Long, lppe As PROCESSENTRY32) As Long

Private Declare Function Process32Next Lib "kernel32" (ByVal hSnapshot As Long, lppe As PROCESSENTRY32) As Long

Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal blnheritHandle As Long, ByVal dwAppProcessId As Long) As Long

Private Declare Function TerminateProcess Lib "kernel32" (ByVal ApphProcess As Long, ByVal uExitCode As Long) As Long

Private Type PROCESSENTRY32

dwSize As Long

cntUsage As Long

th32ProcessID As Long

th32DefaultHeapID As Long

th32ModuleID As Long

cntThreads As Long

th32ParentProcessID As Long

pcPriClassBase As Long

dwFlags As Long

szExeFile As String 1024

End Type

Const TH32CS_SNAPHEAPLIST = &H1

Const TH32CS_SNAPPROCESS = &H2

Const TH32CS_SNAPTHREAD = &H4

Const TH32CS_SNAPMODULE = &H8

Const TH32CS_SNAPALL = (TH32CS_SNAPHEAPLIST Or TH32CS_SNAPPROCESS Or TH32CS_SNAPTHREAD Or TH32CS_SNAPMODULE)

Const TH32CS_INHERIT = &H80000000

Dim pid As Long

Dim pname As String

Private Sub taskkill(ByVal taskname As String)

Dim my As PROCESSENTRY32

Dim l As Long

Dim l1 As Long

Dim flag As Boolean

Dim mName As String

Dim i As Integer

l = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)

If l Then

mydwSize = 1060

If (Process32First(l, my)) Then

Do

i = InStr(1, myszExeFile, Chr$(0))

mName = LCase$(Left$(myszExeFile, i - 1))

If mName = LCase$(taskname) Then

pid = myth32ProcessID

pname = mName

Dim mProcID As Long

mProcID = OpenProcess(1&, -1&, pid)

TerminateProcess mProcID, 0&

flag = True

Else

flag = False

End If

Loop Until (Process32Next(l, my) < 1)

l1 = CloseHandle(l)

End If

End Sub

以上就是关于求用VB编程控制外部程序的可行性和详细思路步骤全部的内容,包括:求用VB编程控制外部程序的可行性和详细思路步骤、如何让VB的程序打开另一个外部程序、在VB中怎样打开外部程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10219818.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-06
下一篇2023-05-06

发表评论

登录后才能评论

评论列表(0条)

    保存