最近做了一项小功能,功能要求是这样的
使用CMD启动一款win32程序(VB程序),执行完win32程序后,将结果打印到控制台。
问题一
第一次尝试,查找到可以使用PostMessaage或者SendMessage 根据句柄参数 向窗口发送内容。
CMD_hWnd=Find Widow(“窗口名”)返回需要的窗口句柄
这是一种不安全的操作,因为,窗口会变滴,也可能会存在多个窗口,所以。。。需要修改!!!
Const WM_CHAR = &H102
在leader的帮助下,找到解决方案:
Dim processId As PerformanceCounter
processId = New PerformanceCounter("Process", "Creating Process ID", Process.GetCurrentProcess().ProcessName)
Dim process_parent As Process = Process.GetProcessById(CInt(processId.NextValue()))
Dim CMD_hWnd As IntPtr
' 单引号是VB语言的注释
' 要用MainWindowHandle获取句柄,直接用Handle获取的不是。
CMD_hWnd = process_parent.MainWindowHandle
完美解决
SendMessage(CMD_hWnd, &H102, Asc(Strings.Mid(resultInfo, j, 1)), 0)
问题二
SendMessage()固然可行,但是在使用 start /w xxx.exe 的时候,打印到控制台的信息,会丢失字母,比如success,输出的就是suces,error,输出eror
我自己尝试查找,然后发现找到了pip,重定向,更复杂。
同样,在帮助下,找到解决方法
Private Declare Function AttachConsole Lib "kernel32" Alias "AttachConsole" (ByVal hwnd As Integer) As Long
'attach_parent_process = -1
AttachConsole(-1)
Console.WriteLine(resultInfo)
https://docs.microsoft.com/zh-cn/windows/console/attachconsole
问题解决。