Files
mRemoteNG/mRemoteV1/Connection/Connection.Protocol.IntApp.vb

187 lines
6.8 KiB
VB.net

Imports mRemote.App.Native
Imports System.Threading
Imports Microsoft.Win32
Imports System.Drawing
Imports mRemote.App.Runtime
Namespace Connection
Namespace Protocol
Public Class IntApp
Inherits Connection.Protocol.Base
#Region "Private Properties"
Private IntAppProcessStartInfo As New ProcessStartInfo()
Private Arguments As String
Private ExtApp As Tools.ExternalApp
#End Region
#Region "Public Properties"
Private _IntAppHandle As IntPtr
Public Property IntAppHandle() As IntPtr
Get
Return Me._IntAppHandle
End Get
Set(ByVal value As IntPtr)
Me._IntAppHandle = value
End Set
End Property
Private _IntAppProcess As Process
Public Property IntAppProcess() As Process
Get
Return Me._IntAppProcess
End Get
Set(ByVal value As Process)
Me._IntAppProcess = value
End Set
End Property
Private _IntAppPath As String
Public Property IntAppPath() As String
Get
Return _IntAppPath
End Get
Set(ByVal value As String)
_IntAppPath = value
End Set
End Property
Public ReadOnly Property Focused() As Boolean
Get
If GetForegroundWindow() = IntAppHandle Then
Return True
Else
Return False
End If
End Get
End Property
#End Region
#Region "Private Events & Handlers"
Private Sub ProcessExited(ByVal sender As Object, ByVal e As System.EventArgs)
MyBase.Event_Closed(Me)
End Sub
#End Region
#Region "Public Methods"
Public Sub New()
End Sub
Public Overrides Function SetProps() As Boolean
ExtApp = App.Runtime.GetExtAppByName(InterfaceControl.Info.ExtApp)
If InterfaceControl.Info IsNot Nothing Then
ExtApp.ConnectionInfo = InterfaceControl.Info
End If
_IntAppPath = ExtApp.ParseText(ExtApp.FileName)
Arguments = ExtApp.ParseText(ExtApp.Arguments)
Return MyBase.SetProps()
End Function
Public Overrides Function Connect() As Boolean
Try
If ExtApp.TryIntegrate = False Then
ExtApp.Start(Me.InterfaceControl.Info)
Me.Close()
Return Nothing
End If
IntAppProcessStartInfo.FileName = _IntAppPath
IntAppProcessStartInfo.Arguments = Arguments
IntAppProcess = Process.Start(IntAppProcessStartInfo)
IntAppProcess.EnableRaisingEvents = True
IntAppProcess.WaitForInputIdle()
AddHandler IntAppProcess.Exited, AddressOf ProcessExited
Dim TryCount As Integer = 0
Do Until IntAppProcess.MainWindowHandle <> IntPtr.Zero And Me.InterfaceControl.Handle <> IntPtr.Zero And Me.IntAppProcess.MainWindowTitle <> "Default IME"
If TryCount >= My.Settings.MaxPuttyWaitTime * 2 Then
Exit Do
End If
IntAppProcess.Refresh()
Thread.Sleep(500)
TryCount += 1
Loop
IntAppHandle = IntAppProcess.MainWindowHandle
mC.AddMessage(Messages.MessageClass.InformationMsg, "--- IntApp Stuff ---", True)
mC.AddMessage(Messages.MessageClass.InformationMsg, "IntApp Handle: " & IntAppHandle.ToString, True)
mC.AddMessage(Messages.MessageClass.InformationMsg, "IntApp Title: " & IntAppProcess.MainWindowTitle, True)
mC.AddMessage(Messages.MessageClass.InformationMsg, "IntApp Handle: " & Me.InterfaceControl.Parent.Handle.ToString, True)
SetParent(Me.IntAppHandle, Me.InterfaceControl.Parent.Handle)
SetWindowLong(Me.IntAppHandle, 0, WS_VISIBLE)
ShowWindow(Me.IntAppHandle, SW_SHOWMAXIMIZED)
Resize()
MyBase.Connect()
Return True
Catch ex As Exception
mC.AddMessage(Messages.MessageClass.ErrorMsg, "Couldn't Connect" & vbNewLine & ex.Message)
Return False
End Try
End Function
Public Overrides Sub Focus()
Try
SetForegroundWindow(IntAppHandle)
Catch ex As Exception
mC.AddMessage(Messages.MessageClass.ErrorMsg, "Couldn't Focus (Connection.Protocol.IntApp)" & vbNewLine & ex.Message, True)
End Try
End Sub
Public Overrides Sub Resize()
Try
MoveWindow(IntAppHandle, -SystemInformation.FrameBorderSize.Width, -(SystemInformation.CaptionHeight + SystemInformation.FrameBorderSize.Height), Me.InterfaceControl.Width + (SystemInformation.FrameBorderSize.Width * 2), Me.InterfaceControl.Height + SystemInformation.CaptionHeight + (SystemInformation.FrameBorderSize.Height * 2), True)
Catch ex As Exception
mC.AddMessage(Messages.MessageClass.ErrorMsg, "Couldn't Resize (Connection.Protocol.IntApp)" & vbNewLine & ex.Message, True)
End Try
End Sub
Public Overrides Sub Close()
Try
If IntAppProcess.HasExited = False Then
IntAppProcess.Kill()
End If
Catch ex As Exception
mC.AddMessage(Messages.MessageClass.ErrorMsg, "Killing IntApp Process failed (Connection.Protocol.IntApp)" & vbNewLine & ex.Message, True)
End Try
Try
If IntAppProcess.HasExited = False Then
IntAppProcess.Dispose()
End If
Catch ex As Exception
mC.AddMessage(Messages.MessageClass.ErrorMsg, "Dispose of IntApp process failed (Connection.Protocol.IntApp)" & vbNewLine & ex.Message, True)
End Try
MyBase.Close()
End Sub
#End Region
#Region "Public Shared Methods"
#End Region
#Region "Enums"
Public Enum Defaults
Port = 0
End Enum
#End Region
End Class
End Namespace
End Namespace