Jag har gjort ett program som ibland behöver uppdateras av användarna. Ett uppdateringsprogram hämtar då den nya versionen på en plats i servern och kopierar den nya exe-filen till datorn och skriver över den gamla filen. Jag bara spånar utan täckning. Något i den här stilen Ditt exemplar stängde bara ett program tyvärr men idén med en loop verkar instressant. Ska kolla vidare med med det. Ett sätt som ofta används för uppdatering är att byta namn på exe-filen som körs (det går nämligen, även om det inte går att skriva över den eller radera den) och sedan kopiera dit den nya versionen med rätt namn. <b>ghw = FindWindow(vbNullString, "Kalkylatorn")</b> Jag var tvungen att göra ett test. Loopa igenom alla processer och kontrollera sökvägen till varje process. Går den till ditt program så stänger du ner den. Den här koden stänger ner 4 instanser av Form1 på min skärm. Nej jag får bara din kod att stänga ett program (Tog Kalkylatorn) i taget, man får alltså klicka flera gånger. Däremot fungerar det om man lägger koden i en Timer istället med en låg Interval så att det går snabbt men det är nog väldigt dålig kod. Sen måste man ju stanna timern efter ett tag på något sätt. mmm.... förstår ungefär. Jag är ganska säker på att mitt förslag fungerar, har för mig att jag själv gjorde så. Ja jag testade men fick inget att fungera mer än en gång. Löste det dock med en timer så stänger programet 10 ggr och det fungerade bra. Tack alla.Stänga ett program
Ibland förekommer det att en annan användare har programmet öppet på datorn men inte stängt det utan bara använt "Växla användare". Det betyder att programmet kan vara igång i ända upp till fyra gånger samtidigt på datorn.
När en användare ska uppdatera programmet kopieras inte exe-filen för att filen redan körs hos dom andra användarna som ej är utloggade. Då har jag lagt in att uppdateringsprogrammet först ska stänga alla öppna exe-filer som ska bytas ut. Jag använder koden:
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Const WM_CLOSE = &H10
Dim ghw As Long
ghw = FindWindow(vbNullString, "Kalkylatorn")
PostMessage ghw, WM_CLOSE, CLng(0), CLng(0)
Den här exemplet stänger ner Kalkylatorn. Men nu till problemet, det stänger bara ner ett program inte alla fyra som kan vara öppna. Vad gör jag.Sv: Stänga ett program
Kan du inte köra koden ovan i en loop tills du får ett ERROR meddelande.
If ERROR vad det nu blir så hoppar du ur loopen.Sv:Stänga ett program
<code>
Private Sub Command1_Click()
Dim ghw As Long
Do
ghw = FindWindow(vbNullString, "Kalkylatorn")
PostMessage ghw, WM_CLOSE, CLng(0), CLng(0)
DoEvents
On Error GoTo ErrorHandler
Exit Do
Loop
ErrorHandler:
MsgBox "Klar"
Resume Next
End Sub
</code>Sv: Stänga ett program
Sv:Stänga ett program
Nästa gång användarna startar blir det den nya versionen. Sedan kan ju den nya versionen leta efter gamla om den vet vad de kan tänkas heta och städa bort dem.Sv: Stänga ett program
Kan det vara så att dom får namn Ex. "Kalkylatorn2" "Kalkylatorn3" osv.
Dvs har alla 4 samma/olika WindowName. ?
Spånar SvenSv:Stänga ett program
Jag lade upp 4 instanser av ett Form1 projekt.
Lade din kod i en CommandClick.
<code>
Private Sub Command1_Click()
Dim ghw As Long
ghw = FindWindow(vbNullString, "Form1")
PostMessage ghw, WM_CLOSE, CLng(0), CLng(0)
End Sub
</code>
Trycker 1gg en försvinner ,trycker igen och nästa försvinner osv 4 ggr
Dvs om du kör Call Command1_Click 4 ggr så är det löst.
Vi måste förstås försöka ta reda på hur många instanser som är igång.
Och tex köra en For Next detta antal ggr med Call till Command_Click
I o fs så händer det inget tokigt om du kör 10ggr och det bara finns 3 instanser.
Ful lösning men "was tut man" som tysken sägerSv: Stänga ett program
https://www.google.se/search?sourceid=chrome&ie=UTF-8&q=vb+find+process+pathSv:Stänga ett program
<code>
Option Explicit
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" _
(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, _
ByVal lParam As Long) As Long
Private Const WM_CLOSE = &H10
Private Sub Command1_Click()
Dim i As Long
For i = 0 To 5
Call KillInstans("Form1")
DoEvents
Next 'i
End Sub
Private Sub KillInstans(ByVal wName As String)
Dim ghw As Long
ghw = FindWindow(vbNullString, wName)
PostMessage ghw, WM_CLOSE, CLng(0), CLng(0)
DoEvents
End Sub
</code>Sv: Stänga ett program
Sv:Stänga ett program
Stänga processor mmmm.... Timer mmm...
Lycka till mina förslag har tagit slut.Sv:Stänga ett program
Har du testat?Sv: Stänga ett program