最近做了一项小功能,功能要求是这样的

使用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

问题解决。