Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
428to432
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
428to432
428to432
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Anwendung nicht mehrfach starten

Anwendung nicht mehrfach starten
20.05.2004 21:11:18
NE
Hallo,
wie schaffe ich es denn, wenn eine Anwendung, bei mir der Vim halt,
[kann auch eine x-beliebige andre sein, mir gehts nur ums Prinzip]
bereits offen ist, dass beim Ausführen der Sub. x() [that was tricky here] diese nicht nochmal gestartet
wird, sondern dass die Textdatei in der bestehenden Anwendung geladen wird.
Ich hab' zwar schon paar Codesnippets, kriegs aber nich gebacken,
u.a. wg. Schlüsselwort 'Me', was müsste ich denne stattdessen schreiben ?
Danke Danke
die NE
--
Option Explicit
Private Declare

Function ShellExecute Lib "shell32.dll" Alias _
"ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation _
As String, ByVal lpFile As String, ByVal lpParameters _
As String, ByVal lpDirectory As String, ByVal nShowCmd _
As Long) As Long

Sub x()
Dim s$, test as long
s = "c:\dummy\" & InputBox("filename", "Input") & ".txt"
Shell ("c:\vim\vim61\gvim.exe " & s)
test = ShellExecute(Me.hwnd, "Open", s) '?
End Sub


15
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Anwendung nicht mehrfach starten
20.05.2004 21:28:13
Nepumuk
Hi Nancy,
so:


Option Explicit
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As LongByVal lpOperation As StringByVal lpFile As StringByVal lpParameters As StringByVal lpDirectory As StringByVal nShowCmd As LongAs Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassname As StringByVal lpWindowName As StringAs Long
Sub x()
    ShellExecute FindWindow("xlMain", vbNullString), "open", "gvim.exe " & InputBox("filename", "Input") & ".txt", vbNullString, "c:\vim\vim61\", 3
End Sub


Gruß
Nepumuk
Anzeige
AW: Anwendung nicht mehrfach starten
20.05.2004 21:55:08
NE
Hallo Nepumuk,
muchas gracias, aber es tut sich nix
Hatte deinen Originalcode probiert und sowie eine kleine Verifizierung dessen meiner Wenigkeit:

Sub x()
ShellExecute FindWindow("xlMain", vbNullString), "open", "gvim.exe " & _
"c:\dummy\" & InputBox("filename", "Input") & ".txt", vbNullString, "c:\vim\vim61\", 3
End Sub

Tut aber auch nicht, neagtiv, ein simples 'Garnix' passiert, nich mal ne Fehlermeldung ...
Ich stell mich wiewohl zu bluna an, denke mal?
lg Nancy
--
smash your head on keyboard to continue
Anzeige
AW: Anwendung nicht mehrfach starten
20.05.2004 21:58:21
Nepumuk
Hallo Nancy,
da ich nicht über das Programm verfüge, war es ein Schuss ins Blaue. Ich habe das aber schon mit einem anderen Programm gemacht, und da hat es funktioniert.
Gruß
Nepumuk
AW: Anwendung nicht mehrfach starten
NE
Hi Nepumuk,
okay, klar, mal eine Bitte noch, ich bin da nicht so sattelfest,
nehmen wir mal den reinen Windows-Editor, als gemeinsame Basis, zum Vergleich,
wie müsste dann die Zeile lauten?
lg Nancy
AW: Anwendung nicht mehrfach starten
20.05.2004 22:39:23
Nepumuk
Hallo Hancy,
hatte die Parameter etwas verdreht. So sollte es laufen:
ShellExecute FindWindow("xlMain", vbNullString), "open", "c:\vim\vim61\gvim.exe", InputBox("filename", "Input") & ".txt", "c:\dummy\", 3
Gruß
Nepumuk
Anzeige
AW: Anwendung nicht mehrfach starten
NE
Hiho Nepumuk,
Danke, jetz tut er wenigstens was, aber ich bekomme trotzdem mehrere 'Vims' mit mehreren txt-files ;-), also derselbe effekt wie bei einem reinem shell-command :-(
Vielleicht wärs doch besser, das anhand einer Application zu prüfen die beide Seiten haben, ... können wir auch auf morgen vertagen ;-)
Ich möcht trotzdem erstmal thx sagem, bin ja nun schon einen Schritt weiter,
wünsch ein 'bildlich' gemütliches Beddl und *chrrrchrrr* sweet dreams ;-)
lg from 'N' to 'N' ;;-))
Nancy
AW: Anwendung nicht mehrfach starten
21.05.2004 04:01:35
Nepumuk
Guten Morgen Nancy,
ich hatte das mit Word und einer Textdatei getestet und da funktionierte es wie gewünscht. Bei "Vim" müssen wir einen anderen Weg wählen. D.h. "Vim" per Programm schließen und mit der neuen Textdatei wieder öffnen. Dazu benötigst du aber den Fenstertitel von "Vim". Öffne mal eine Textdatei mit "Vim" und lass folgende Suchroutine laufen:


Option Explicit
Private Declare Function GetWindow Lib "user32" (ByVal hwnd As LongByVal wCmd As LongAs Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As LongByVal wIndx As LongAs Long
Private Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As LongAs Long
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As LongByVal lpString As StringByVal cch As LongAs Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As StringByVal lpWindowName As StringAs Long
Const GW_HWNDFIRST = 0
Const GW_HWNDNEXT = 2
Const GWL_STYLE = -16
Const WS_VISIBLE = &H10000000
Const WS_BORDER = &H800000
Public Sub GetWindowList()
    Dim hwnd As Long, sTitle As String, lStyle As Long, lngZeile As Long
    hwnd = GetWindow(FindWindow(vbNullString, vbNullString), GW_HWNDFIRST)
    Do
        lStyle = GetWindowLong(hwnd, GWL_STYLE) And (WS_VISIBLE Or WS_BORDER)
        sTitle = GetWindowTitle(hwnd)
        If (lStyle = (WS_VISIBLE Or WS_BORDER)) = True And Trim(sTitle) <> "" Then
            lngZeile = lngZeile + 1
            Cells(lngZeile, 1) = sTitle
        End If
        hwnd = GetWindow(hwnd, GW_HWNDNEXT)
    Loop Until hwnd = 0
End Sub
Private Function GetWindowTitle(ByVal hwnd As LongAs String
    Dim lResult As Long, sTemp As String
    lResult = GetWindowTextLength(hwnd) + 1
    sTemp = Space(lResult)
    lResult = GetWindowText(hwnd, sTemp, lResult)
    GetWindowTitle = Left(sTemp, Len(sTemp) - 1)
End Function


Du bekommst eine Liste aller laufenden Anwendungen. Darunter auch die von "Vim". Diesen Titel benötigst du für obige Suchroutine. Der Titel besteht aus eine unveränderlichen und einem, je nach geöffnetem Dateinamen, veränderlichen Teil. Den unveränderlichen baust du in die Suchroutine folgendermaßen ein:


If (lStyle = (WS_VISIBLE Or WS_BORDER)) = True And Trim(sTitle) <> "" Then
    If InStr(1, sTitle, "unveränderlicher Titel") <> 0 Then
        PostMessage hwnd, &H10, 0&, 0&
        Exit Do
    End If
End If


dazu benötigst du noch die Funktion:


Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal Hwnd As LongByVal wMsg As LongByVal wParam As Long, lParam As Any) As Long


Damit wird das "Vim" - Fenster gesucht und geschlossen. Danach kannst du den bekannten Weg zum öffnen des selben mit einer anderen Textdatei gehen. Wobei du den Aufruf auch kürzen kannst, da das "Vim" - Fenster sowieso nicht an die Mappe gebunden wird. Also:


ShellExecute 0, "open", "c:\vim\vim61\gvim.exe", InputBox("filename", "Input") & ".txt", "c:\dummy\", 3


reicht vollkommen.
Gruß
Nepumuk
Anzeige
Perfekto :-)
NE
Hallo Nepumuk,
äh, nun bin ich ja erstmal etwas sprachlos ...
Was soll ich sagen ?
for i=1 to 1000
debug.print "Dankeschön"
next
::-)))
Guddi, ich hab' das probiert, das mit der Liste -- perfekt
Dann hab ich innerhalb der Schleife die If-Abfrage reingebastelt:
If InStr(1, sTitle, "- GVIM") 0 Then
auch perfekt, er schließt ihn :-)
Was ich nur jetz nich begreife, wozu nun noch ein shellExecute ?,
ich mein ein blanker Shell am Ende der Sub:
Shell ("c:\vim\vim61\gvim.exe " & InputBox("filename", "Input") & ".txt")
müsste doch reichen bzw. reicht auch, oder lauf' ich da Gefahr?
Nochwas:
Wie bist Du denn überhaupt darauf gekommen, ich mein mit der veränderlichen Titelleiste?
Wenn ich das richtig sehe, ist's wohl denne zB beim Internet Explorer ähnlich?
Nunja einfach nochmal schlichtes Danke,
da hab' ich ja nun gleich zwei Varianten kennengelernt :-)
lg Nancy
Anzeige
AW: Perfekto :-)
21.05.2004 11:51:03
Nepumuk
Hi Nancy,
1. Mit welchem Befehl du die Textdatei dann öffnest ist schnurzpiep.
2. Bei fast allen Programmen die eine Containerfunktion ausüben (d.h. du kannst verschiedene Dateien oder wie beim IE verschiedene Sites mit ein und der selben Anwendung öffen), steht der Dateiname in der Titelleiste.
Gruß
Nepumuk
AW: Anwendung nicht mehrfach starten
21.05.2004 04:01:35
Nepumuk
Guten Morgen Nancy,
ich hatte das mit Word und einer Textdatei getestet und da funktionierte es wie gewünscht. Bei "Vim" müssen wir einen anderen Weg wählen. D.h. "Vim" per Programm schließen und mit der neuen Textdatei wieder öffnen. Dazu benötigst du aber den Fenstertitel von "Vim". Öffne mal eine Textdatei mit "Vim" und lass folgende Suchroutine laufen:


Option Explicit
Private Declare Function GetWindow Lib "user32" (ByVal hwnd As LongByVal wCmd As LongAs Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As LongByVal wIndx As LongAs Long
Private Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As LongAs Long
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As LongByVal lpString As StringByVal cch As LongAs Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As StringByVal lpWindowName As StringAs Long
Const GW_HWNDFIRST = 0
Const GW_HWNDNEXT = 2
Const GWL_STYLE = -16
Const WS_VISIBLE = &H10000000
Const WS_BORDER = &H800000
Public Sub GetWindowList()
    Dim hwnd As Long, sTitle As String, lStyle As Long, lngZeile As Long
    hwnd = GetWindow(FindWindow(vbNullString, vbNullString), GW_HWNDFIRST)
    Do
        lStyle = GetWindowLong(hwnd, GWL_STYLE) And (WS_VISIBLE Or WS_BORDER)
        sTitle = GetWindowTitle(hwnd)
        If (lStyle = (WS_VISIBLE Or WS_BORDER)) = True And Trim(sTitle) <> "" Then
            lngZeile = lngZeile + 1
            Cells(lngZeile, 1) = sTitle
        End If
        hwnd = GetWindow(hwnd, GW_HWNDNEXT)
    Loop Until hwnd = 0
End Sub
Private Function GetWindowTitle(ByVal hwnd As LongAs String
    Dim lResult As Long, sTemp As String
    lResult = GetWindowTextLength(hwnd) + 1
    sTemp = Space(lResult)
    lResult = GetWindowText(hwnd, sTemp, lResult)
    GetWindowTitle = Left(sTemp, Len(sTemp) - 1)
End Function


Du bekommst eine Liste aller laufenden Anwendungen. Darunter auch die von "Vim". Diesen Titel benötigst du für obige Suchroutine. Der Titel besteht aus eine unveränderlichen und einem, je nach geöffnetem Dateinamen, veränderlichen Teil. Den unveränderlichen baust du in die Suchroutine folgendermaßen ein:


If (lStyle = (WS_VISIBLE Or WS_BORDER)) = True And Trim(sTitle) <> "" Then
    If InStr(1, sTitle, "unveränderlicher Titel") <> 0 Then
        PostMessage hwnd, &H10, 0&, 0&
        Exit Do
    End If
End If


dazu benötigst du noch die Funktion:


Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal Hwnd As LongByVal wMsg As LongByVal wParam As Long, lParam As Any) As Long


Damit wird das "Vim" - Fenster gesucht und geschlossen. Danach kannst du den bekannten Weg zum öffnen des selben mit einer anderen Textdatei gehen. Wobei du den Aufruf auch kürzen kannst, da das "Vim" - Fenster sowieso nicht an die Mappe gebunden wird. Also:


ShellExecute 0, "open", "c:\vim\vim61\gvim.exe", InputBox("filename", "Input") & ".txt", "c:\dummy\", 3


reicht vollkommen.
Gruß
Nepumuk
Anzeige
AW: Anwendung nicht mehrfach starten
Reinhard
Hallo Nancy,
ich fand noch folgenden Code,ich hab da nur h() eingebaut er zeigt dir hwnd und Fensternamen der Fenster an.
Naja, vielleicht nützt dir das was.
Gruß
Reinhard
Option Explicit
Private Declare Function GetWindow Lib "user32" (ByVal hWnd As Long, ByVal wCmd As Long) As Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal wIndx As Long) As Long
Private Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hWnd As Long) As Long
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As Long, ByVal lpWindowName As Long) As Long
Const GW_HWNDFIRST = 0
Const GW_HWNDNEXT = 2
Const GWL_STYLE = (-16)
Const WS_VISIBLE = &H10000000
Const WS_BORDER = &H800000
Public Sub GetWindowList()
Dim h() As Long
Dim hWnd As Long, sTitle As String, lStyle As Long, Task_name() As String
Dim count As Integer, index As Integer, gefunden As Boolean
hWnd = FindWindow(ByVal 0&, ByVal 0&)
hWnd = GetWindow(hWnd, GW_HWNDFIRST)
Do
gefunden = False
lStyle = GetWindowLong(hWnd, GWL_STYLE)
lStyle = lStyle And (WS_VISIBLE Or WS_BORDER)
sTitle = GetWindowTitle(hWnd)
If (lStyle = (WS_VISIBLE Or WS_BORDER)) = True Then
If Trim(sTitle) "" Then
For index = 1 To count
If Task_name(index) = sTitle Then
gefunden = True
Exit For
End If
Next index
If Not gefunden Then
count = count + 1
ReDim Preserve Task_name(1 To count)
Task_name(count) = sTitle
ReDim Preserve h(1 To count)
h(count) = hWnd
End If
End If
End If
hWnd = GetWindow(hWnd, GW_HWNDNEXT)
Loop Until hWnd = 0
For index = 1 To count
MsgBox h(index) & ": " & Task_name(index)
Next index
End Sub

Private Function GetWindowTitle(ByVal hWnd As Long) As String
Dim lResult As Long, sTemp As String
lResult = GetWindowTextLength(hWnd) + 1
sTemp = Space(lResult)
lResult = GetWindowText(hWnd, sTemp, lResult)
GetWindowTitle = Left(sTemp, Len(sTemp) - 1)
End Function

Anzeige
mit eingefügten pre :-)
Reinhard
Hallo Nancy,
ich fand noch folgenden Code,ich hab da nur h() eingebaut er zeigt dir hwnd und Fensternamen der Fenster an.
Naja, vielleicht nützt dir das was.
Gruß
Reinhard
Option Explicit
Private Declare Function GetWindow Lib "user32" (ByVal hWnd As Long, ByVal wCmd As Long) As Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal wIndx As Long) As Long
Private Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hWnd As Long) As Long
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As Long, ByVal lpWindowName As Long) As Long
Const GW_HWNDFIRST = 0
Const GW_HWNDNEXT = 2
Const GWL_STYLE = (-16)
Const WS_VISIBLE = &H10000000
Const WS_BORDER = &H800000

Public Sub GetWindowList()
Dim h() As Long
Dim hWnd As Long, sTitle As String, lStyle As Long, Task_name() As String
Dim count As Integer, index As Integer, gefunden As Boolean
hWnd = FindWindow(ByVal 0&, ByVal 0&)
hWnd = GetWindow(hWnd, GW_HWNDFIRST)
Do
gefunden = False
lStyle = GetWindowLong(hWnd, GWL_STYLE)
lStyle = lStyle And (WS_VISIBLE Or WS_BORDER)
sTitle = GetWindowTitle(hWnd)
If (lStyle = (WS_VISIBLE Or WS_BORDER)) = True Then
If Trim(sTitle) <> "" Then
For index = 1 To count
If Task_name(index) = sTitle Then
gefunden = True
Exit For
End If
Next index
If Not gefunden Then
count = count + 1
ReDim Preserve Task_name(1 To count)
Task_name(count) = sTitle
ReDim Preserve h(1 To count)
h(count) = hWnd
End If
End If
End If
hWnd = GetWindow(hWnd, GW_HWNDNEXT)
Loop Until hWnd = 0
For index = 1 To count
MsgBox h(index) & ": " & Task_name(index)
Next index
End Sub

Private Function GetWindowTitle(ByVal hWnd As Long) As String
Dim lResult As Long, sTemp As String
lResult = GetWindowTextLength(hWnd) + 1
sTemp = Space(lResult)
lResult = GetWindowText(hWnd, sTemp, lResult)
GetWindowTitle = Left(sTemp, Len(sTemp) - 1)
End Function
Anzeige
AW: mit eingefügten pre :-)
NE
Hallo Reinhard,
auch Dir Danke,
wiewohl das für mich heute abend noch schwieriger zu durchschauen ist als Nepumuks Vorschlag ;-)
Ich versuch auch mal das morgen irgendwie nachzuvollziehen,
Du musst wissen ich - DAU in sowas
thx & lg
Nancy
ui, es klappt
Reinhard
Hallo Nancy,
ich habe mal rumgespielt.
Also starte mal über Start--Ausführen--Notepad den Editor. Dann lass mein voriges Makro laufen, es zeigt dir die hwnd der Editors an.
Bei mir war das die 2140.
Danach habe ich deinen Ansatz gestartet:

Sub x()
Dim s$, test As Long
s = "c:\temp\Allmodul.txt"
test = ShellExecute(2140, vbNullString, s, "",  "",  1)
End Sub

und siehe da, im Editor wurde brav der Inhalt von Allmodul.txt angezeigt *freu*
Gruß
Reinhard
Anzeige
AW: ui, es klappt
NE
Hallo Reinhard,
auch Dir nochmals Danke :-)
lg Nancy

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige