2 Möglichkeiten:
1. mit diesem Tip die erste Instanz mit diesem Tip schliessen http://www.vbarchiv.net/archiv/tipp_details.php?pid=206
Du must achtgeben, dass du das alles in den Sub Main einbaust und nicht ins Form_Load
2. mit diesem Beispiel kannst du an die laufende erste Instanz die Startparameter der zweiten Instanz senden. (Code verbesserungsfähig
Option Explicit
Private Sub Command1_Click()
Unload Me
End Sub
Private Sub Text1_Change()
' Im realbetrieb sollte die Eigenschaft text1.Visible auf False gestellt seion
' Wenn sich der Text ändert is was passiert. Aber nur wenn in der Textbox was
' drinsteht
' denn sonst würde sich die Funktion beim Textlöschen wieder selbst aufrufen
If Text1.Text <> "" Then
MsgBox "Hallo ich bin die erste Instanz, die zweite instanz hat " & vbNewLine & _
"mir was geflüstert und hat sich dann abgemurkst." & vbNewLine & vbNewLine & _
Text1.Text
Text1.Text = ""
End If
End Sub und noch das Modul dazu: (mit der Funktion: FindwindowEx könnte man sich auch noch etwas Code ersparen)
Option Explicit
' zum Childs-abklappern
Private Declare Function EnumChildWindows Lib "User32" _
(ByVal hWndParent As Long, ByVal lpEnumFunc _
As Long, ByVal lParam As Long) As Long
' der Name sagt alles
Private Declare Function GetClassName Lib "User32" Alias _
"GetClassNameA" (ByVal hWND As Long, ByVal _
lpClassName As String, ByVal nMaxCount As Long) _
As Long
Public Declare Function FindWindow Lib "User32" Alias _
"FindWindowA" (ByVal lpClassName As String, ByVal _
lpWindowName As String) As Long
Public Declare Function SendMessageByString Lib "User32" Alias "SendMessageA" ( _
ByVal hWND As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As _
String) As Long
Public Const WM_SETTEXT = &HC
Dim F As Long
Dim Child() As Long
Public Function Childhandle_ermitteln(Mutterhandle As Long, Childklasse As _
String) As Long
Dim x&, Class$, Result&
ReDim Child(0 To 0)
Call EnumChildWindows(Mutterhandle, AddressOf EnumChilds, 0)
If UBound(Child) > 0 Then
For x = 0 To UBound(Child) - 1
Class = Space$(128)
Result = GetClassName(Child(x), Class, 128)
Class = LCase(Left$(Class, Result))
' hier hat die Funktion dann eine Textbox gefunden
If Class = LCase(Childklasse) Then Childtitel_ermitteln = Child(x)
Next x
End If
End Function
Public Function EnumChilds(ByVal ChWnd&, ByVal lParam&) As Long
Child(UBound(Child)) = ChWnd
ReDim Preserve Child(0 To UBound(Child) + 1)
EnumChilds = 1
End Function
Private Sub Main()
Dim Handle As Long
' Der Titeltext der Anwendung darf nicht manipuliert werden, da Findwindow
' sonst kein handle mehr zurückgibt
If App.PrevInstance = False Then
Form1.Show ' wenns die erste instanz ist die Form zeigen
Else
' Das Handle der ersten instanz ermitteln
F = FindWindow(vbNullString, "Test Kommunikation") ' Das Handle der ersten
' instanz herausfinden (Das Fenster der 2. Instanz darf zu diesem Zeitpunkt
' nicht geladen sein !!!)
Handle = Childhandle_ermitteln(F, "ThunderRT6TextBox") ' Die Funktion
' aufrufen die die Controls der ersten Instanz abklappert und bei einer
' Textbox eine zahl zurückgibt
If Handle <> 0 Then
Call SendMessageByString(Handle, WM_SETTEXT, 0, Command) ' Weil wir ja das
' Handle gefunden haben senden wir den text
End If
End ' und wieder beenden
End If
End Sub Das obige beispiel hat noch ein paar Wermutstropfen: es darf nur eine Textbox auf der Form sein, da die Funktion Childhandle_ermitteln sonst das falsche Handle zurückgeben würde. Der Fenstertitel der Anwendung darf sich nicht verändern.
Eine eigene versteckte "Empfänger-Form" würde auch diese probleme beheben. |