VB 让外部程序在VB程序的窗体里面运行

11 篇文章 4 订阅
 

Option Explicit

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As Long, ByVal lpWindowName As Long) As Long
Private Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long
Private Declare Function LockWindowUpdate Lib "user32" (ByVal hwndLock As Long) As Long
Private Declare Function GetDesktopWindow Lib "user32" () As Long
Private Declare Function DestroyWindow Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
Private Declare Function Putfocus Lib "user32" Alias "SetFocus" (ByVal hwnd As Long) As Long

Private Const GW_HWNDNEXT = 2
Private m_Hwnd As Long

Private Sub Form_Load()

    Dim dblPid As Long

    Call LockWindowUpdate(GetDesktopWindow)

    dblPid = Shell("c:\windows\notepad.exe", vbNormalFocus)

    m_Hwnd = InstanceToWnd(dblPid) '根据进程PID找窗口句柄

    SetParent m_Hwnd, Me.hwnd

    Putfocus m_Hwnd                 '记事本设置焦点

    Call LockWindowUpdate(0)

End Sub

Function InstanceToWnd(ByVal target_pid As Long) As Long

    Dim i As Long, lHwnd As Long, lPid As Long, lThreadId As Long

    lHwnd = FindWindow(ByVal 0&, ByVal 0&)   '查找第一个窗口

    Do While lHwnd <> 0

        i = i + 1

        If i Mod 20 = 0 Then DoEvents

        '判断窗口是否没父窗口
        If GetParent(lHwnd) = 0 Then

            '获取该窗口的线程ID
            lThreadId = GetWindowThreadProcessId(lHwnd, lPid)

            If lPid = target_pid Then '找到PID所在窗口句柄

                InstanceToWnd = lHwnd
                Exit Do

            End If

        End If

        '继续查找下一个兄弟窗口
        lHwnd = GetWindow(lHwnd, GW_HWNDNEXT)

        Debug.Print Hex$(lHwnd)

    Loop

End Function

Private Sub Form_Unload(Cancel As Integer)

    Call DestroyWindow(m_Hwnd)
    'TerminateProcess GetCurrentProcess, 0    '野蛮了些
    Set Form1 = Nothing

End Sub

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要让 VB.NET 窗体应用程序接收外部发来的信息,你需要使用 Windows API 中的 `RegisterWindowMessage` 函数和 `WndProc` 方法。 首先,在你的窗体应用程序中,你需要定义一个 Windows 消息常量。这个常量将会作为你的应用程序的标识符,用于在系统中传递消息。你可以在你的窗体代码中添加以下代码: ``` Public Const WM_APP As Integer = &H8000 ``` 接下来,在你的窗体类中重写 `WndProc` 方法。这个方法将会接收并处理你的应用程序接收到的所有消息。你需要添加以下代码: ``` Protected Overrides Sub WndProc(ByRef m As Message) If m.Msg = WM_APP Then ' 在这里处理接收到的消息 End If MyBase.WndProc(m) End Sub ``` 现在,你可以使用 `RegisterWindowMessage` 函数来注册你的应用程序的标识符。这个函数将会返回一个整数值,你需要将这个值存储到一个变量中以备后用。你可以在你的窗体代码中添加以下代码: ``` Public WithEvents MyMessageReceiver As New NativeWindow() Private Sub Form_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load MyMessageReceiver.CreateHandle(New CreateParams()) Dim msgId As Integer = RegisterWindowMessage("MyAppMessage") If msgId <> 0 Then MyMessageReceiver.AssignHandle(New IntPtr(msgId)) End If End Sub ``` 现在,当你的应用程序接收到来自系统中任何地方的消息时,它将会调用 `WndProc` 方法。你可以在这个方法中处理接收到的消息。例如,你可以添加以下代码: ``` Protected Overrides Sub WndProc(ByRef m As Message) If m.Msg = WM_APP Then ' 接收到了消息,可以在这里处理它 MessageBox.Show("收到了消息:" & m.WParam.ToString()) End If MyBase.WndProc(m) End Sub ``` 以上就是在 VB.NET 窗体应用程序中接收外部发来的信息的基本步骤。注意,这个方法只适用于 Windows 操作系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝图

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值