得到当前Dos窗口的句柄

xiangshi 2005-09-22 10:48:52
先用【运行】-(cmd)打开一个dos窗口
再运行我的程序如(d:\test.exe),该程序是无窗体的,从模块的sub main启动
现在我想的是:在我的程序中得到该dos窗口的句柄,通过标准输入输出函数,把一些信息直接输出到dos窗口
敢问各位大侠,是否能实现?
...全文
255 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
vansoft 2005-09-23
  • 打赏
  • 举报
回复
VB寫的程序可以和DOS交互的。
看你有沒有水平了。
James_zhjian 2005-09-23
  • 打赏
  • 举报
回复
新建一个工程project1,窗口form1 ,加入一个listview (lvwPrss) 3个button(cmdRefresh,cmdDelete,cmdExit)



代码如下
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function ExitProcess Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
Private Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Any, ByVal lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
Private Declare Function GetCurrentProcess Lib "kernel32" () As Long


Private Const LOCALE_STIMEFORMAT = &H1003
Private Const LOCALE_SSHORTDATE = &H1F
Private Const WM_SETTINGCHANGE = &H1A
Private Const HWND_BROADCAST = &HFFFF&

Private Declare Function SetLocaleInfo Lib "kernel32" Alias "SetLocaleInfoA" (ByVal Locale As Long, ByVal LCType As Long, ByVal lpLCData As String) As Boolean
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function GetSystemDefaultLCID Lib "kernel32" () As Long



'***************************************

Option Explicit
'获得进程的句柄
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 Declare Function CreateToolhelp32Snapshot Lib "kernel32" _
(ByVal lFlags As Long, lProcessID As Long) As Long
'获得系统快照中的第一个进程的信息
Private Declare Function ProcessFirst Lib "kernel32" Alias "Process32First" _
(ByVal mSnapShot As Long, uProcess As PROCESSENTRY32) As Long
'获得系统快照中的下一个进程的信息
Private Declare Function ProcessNext Lib "kernel32" Alias "Process32Next" _
(ByVal mSnapShot As Long, uProcess As PROCESSENTRY32) 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 * 260&
End Type
Private Const TH32CS_SNAPPROCESS As Long = 2&
Dim mresult



Private Sub cmdFormateDate_Click()

End Sub

Private Sub cmdRefresh_Click()
doList
End Sub


Private Sub Command9_Click()

End Sub

Private Sub Form_Load()


lvwPrss.ListItems.Clear
lvwPrss.ColumnHeaders.Clear
lvwPrss.ColumnHeaders.Add , , "进程ID", 1500
lvwPrss.ColumnHeaders.Add , , "进程名", 5600
lvwPrss.LabelEdit = lvwManual
lvwPrss.FullRowSelect = True
lvwPrss.HideSelection = False
lvwPrss.HideColumnHeaders = False
lvwPrss.View = lvwReport
End Sub
Private Sub Form_Activate()
doList

End Sub
'listview的大小随窗体变化
Private Sub Form_Resize()
lvwPrss.Move 0, 0, Me.ScaleWidth - cmdRefresh.Width, Me.ScaleHeight
cmdRefresh.Move lvwPrss.Width - lvwPrss.Left
cmdDelete.Move lvwPrss.Width - lvwPrss.Left
cmdExit.Move lvwPrss.Width - lvwPrss.Left
End Sub

Private Sub doList()
Dim uProcess As PROCESSENTRY32
Dim mSnapShot As Long
Dim mName As String
Dim i As Integer
Dim mlistitem As ListItem

lvwPrss.ListItems.Clear
DoEvents
uProcess.dwSize = Len(uProcess)
mSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0&)
If mSnapShot Then
mresult = ProcessFirst(mSnapShot, uProcess)
'失败则返回false
Do While mresult
i = InStr(1, uProcess.szexeFile, Chr(0))
mName = LCase$(Left$(uProcess.szexeFile, i - 1))
Set mlistitem = lvwPrss.ListItems.Add(, , Text:=uProcess.th32ProcessID)
mlistitem.SubItems(1) = mName
mresult = ProcessNext(mSnapShot, uProcess)
Loop
End If
cmdDelete.Enabled = (lvwPrss.ListItems.Count > 0)
End Sub

'强行终止当前进程
Private Sub cmdDelete_Click()
If lvwPrss.ListItems.Count = 0 Then
Exit Sub
End If
If MsgBox("真的终止" & lvwPrss.Name & " 进程吗?", vbYesNo + vbQuestion) <> vbYes Then
Exit Sub
End If

Dim mProcID As Long
mProcID = OpenProcess(1&, -1&, lvwPrss.SelectedItem)
TerminateProcess mProcID, 0&
DoEvents
lvwPrss.ListItems.Remove (lvwPrss.SelectedItem.Index)
lvwPrss.Refresh
End Sub


'显示错误信息
Sub ErrMsgProc(mMsg As String)
MsgBox mMsg & vbCrLf & Err.Number & Space(5) & Err.Description
End Sub



Private Sub Form_Unload(Cancel As Integer)
Unload Form1
End Sub

James_zhjian 2005-09-23
  • 打赏
  • 举报
回复
有一个小的任务管理器的程序,能查询到系统进程,关闭,要么
xiangshi 2005-09-22
  • 打赏
  • 举报
回复
唉,我不做控制台程序,高手告诉我该怎么得到该dos窗口的句柄
急,多谢!
viena 2005-09-22
  • 打赏
  • 举报
回复
VB不能做控制台程序,改用别的吧
xiangshi 2005-09-22
  • 打赏
  • 举报
回复
是啊,我只是输出信息到窗口或标准输出了
viena 2005-09-22
  • 打赏
  • 举报
回复
不能吧,你得到窗口句柄,只能对窗口操作,对其内部程序好像无能为力吧
xiangshi 2005-09-22
  • 打赏
  • 举报
回复
那样也不好,我试过了,要求不一样啊
想faysky2这样就可以了,谢谢
如果还用更好的方法,请大家提出来,分不够加好了
faysky2 2005-09-22
  • 打赏
  • 举报
回复
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Dim lngHwnd As Long
lngHwnd = FindWindow("ConsoleWindowClass", "C:\WINDOWS\System32\cmd.exe")
faysky2 2005-09-22
  • 打赏
  • 举报
回复
先用【运行】-(cmd)打开一个dos窗口,再运行我的程序如(d:\test.exe)
与其那样,不如直接在你的程序里调用dos窗口了,用Shell或shellExecute函数调用,同时也可以把需要的命令写到dos窗口上执行

1,486

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧