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