Jag håller på med ett program men har fastnat. Du vill kommunicera med ett redan öppnat prog ? tex Word ? Jag har gjort på följande vis. Som jag ser det är det väl bara att växla med AppActivate "titel på Formen" eller processId. Skickar med lite kod också.....Öppna fil i redan öppnat program.
Hur gör jag för att när man ska öppna en fil så ska den öppnas i mitt redan öppnade program?
Hoppas ni förstod vad jag menade.
/JonSv: Öppna fil i redan öppnat program.
Sv: Öppna fil i redan öppnat program.
Jag tar det via mitt scenario med min egen filmspelare
Användaren öppnar film1, spelaren öppnas och dess hwnd skrivs till registret.
Användaren har fortfarande spelaren öppen men klickar på film2 i explorer.
En ny instans av spelaren öppnas och via App.PrevInstance detectar jag att
det finns en föregående instans öppen.
Från den senaste instansen av spelare skickar jag då via API SendMessage sökvägen
till film2 till den först öppnade spelaren, har ju hwnd i registret. Första instansen av spelaren tar emot sökvägen i meddelandet till den och utför nödvändiga åtgärder för
att öppna den. Andra instansens slås ner.
Hoppas du förstår vad jag menar :-)Sv: Öppna fil i redan öppnat program.
Sv: Öppna fil i redan öppnat program.
kompilera nedanstående och öppna en instans av programmet.
Öppna sedan kommandotolken och skriv programnamn.exe Filenduvillöppna.txt
filnamnet kommer att skrivas i den första instansens form1.
Denna koden är för Form1
<code>
Option Explicit
Private Sub Form_Load()
Dim ret As Long
Dim cds As COPYDATASTRUCT
Dim buf(1 To 255) As Byte
Dim a As String, i As Long, prevHwnd As Long
PrevProc = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf CallbackMsgs)
If App.PrevInstance Then
If Command <> "" Then
a$ = Command
Call CopyMemory(buf(1), ByVal a$, Len(a$))
cds.dwData = 3
cds.cbData = Len(a$) + 1
cds.lpData = VarPtr(buf(1))
prevHwnd = GetSetting("TEST", "INSTANCE", "LATESTHWND", "0")
i = SendMessage(prevHwnd, WM_COPYDATA, Me.hwnd, cds)
End If
End
End If
SaveSetting "TEST", "INSTANCE", "LATESTHWND", CStr(Me.hwnd)
End Sub
</code>
Lägg denna koden i en modul
<code>
Option Explicit
Type COPYDATASTRUCT
dwData As Long
cbData As Long
lpData As Long
End Type
Public Const WM_COPYDATA = &H4A
Public Const GWL_WNDPROC = -4
Public PrevProc As Long
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
(ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" _
(ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
(hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long)
Public Declare Function SendMessage Lib "user32" Alias _
"SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal _
wParam As Long, lParam As Any) As Long
Public Function CallbackMsgs(ByVal wHwnd As Long, ByVal wMsg As Long, ByVal wp_id As Long, ByVal lp_id As Long) As Long
If wMsg = WM_COPYDATA Then
PrevInstanceDetected lp_id
CallbackMsgs = 1
Else
CallbackMsgs = CallWindowProc(PrevProc, wHwnd, wMsg, wp_id, lp_id)
End If
End Function
Public Sub PrevInstanceDetected(lParam As Long)
Dim cds As COPYDATASTRUCT
Dim buf(1 To 255) As Byte
Dim a As String
Call CopyMemory(cds, ByVal lParam, Len(cds))
Call CopyMemory(buf(1), ByVal cds.lpData, cds.cbData)
a$ = StrConv(buf, vbUnicode)
a$ = Left$(a$, InStr(1, a$, Chr$(0)) - 1)
Form1.Print a$
End Sub
</code>