Seite 1 von 2

Messagerequester vereinfachen, wie?

Verfasst: 11.07.2015 16:42
von Zerosurf
Wie kann ich bei folgendem Code nur einen Messagerequester mit allen Infos darin bekommen?

Code: Alles auswählen

EnableExplicit

Procedure GetPidFromName(Name.s)
  Protected result
  Protected Process.PROCESSENTRY32
  Protected ProcSnap = CreateToolhelp32Snapshot_(#TH32CS_SNAPPROCESS, 0)
  If ProcSnap <> #ERROR_INVALID_HANDLE
    Process\dwsize = SizeOf(PROCESSENTRY32)
    If Process32First_(ProcSnap, Process) = #True
      While Process32Next_(ProcSnap, Process) <> #False
        If Trim(PeekS(@Process\szExeFile,#MAX_PATH)) = Name.s
          result = Process\th32ProcessID
          Break
        EndIf
      Wend
    EndIf
    CloseHandle_(ProcSnap)
  EndIf
  ProcedureReturn result
EndProcedure

Procedure TerminateProcess(Name.s, ExitCode = 0)
  Protected result
  Protected processID = GetPidFromName(Name.s)
  If processID
    Protected hProcess  = OpenProcess_(#PROCESS_TERMINATE, #False, processID)
    If hProcess
      If TerminateProcess_(hProcess, ExitCode)
        result = #True
      EndIf
      CloseHandle_(hProcess)
    EndIf
  EndIf
  ProcedureReturn result
EndProcedure

;test:
If TerminateProcess("CCleaner64.exe")
  MessageRequester("","CCleaner64.exe was successfully terminated",0)
Else
  MessageRequester("","Failed to terminate CCleaner64.exe",0)
EndIf
If TerminateProcess("Eraser.exe")
  MessageRequester("","Eraser.exe was successfully terminated",0)
Else
  MessageRequester("","Failed to terminate Eraser.exe",0)
EndIf
If TerminateProcess("flux.exe")
  MessageRequester("","flux.exe was successfully terminated",0)
Else
  MessageRequester("","Failed to terminate flux.exe",0)
EndIf

Re: Messagerequester vereinfachen, wie?

Verfasst: 11.07.2015 16:53
von Nino
Zerosurf hat geschrieben:Wie kann ich bei folgendem Code nur einen Messagerequester mit allen Infos darin bekommen?
Ganz einfach, Du erzeugst entsprechend den Bedingungen eine Stringvariable mit den betreffenden Angaben, und zeigst dann im MessageRequester den Inhalt dieser Stringvariablen.
Beispiel:

Code: Alles auswählen

Define message$, dies.i=#True, sonst.i=#False

If dies
   message$ = "Dies"
Else
   message$ = "Das"
EndIf

If sonst
   message$ + " und sonstiges."
Else
   message$ + " und anderes."
EndIf

MessageRequester("Titel", message$)

Re: Messagerequester vereinfachen, wie?

Verfasst: 11.07.2015 16:55
von Zerosurf
Super, vielen Dank - jetzt nur noch richtig einsetzen! Mal schaun, ob ich das schaffe! ;)

Re: Messagerequester vereinfachen, wie?

Verfasst: 11.07.2015 17:01
von Nino
Das ist sicher eine gute Übung. :-)

Du kannst übrigens in dem Meldungsstring auch

Code: Alles auswählen

+ #LF$
verwenden, um einen Zeilenumbruch einzufügen.
Dadurch lassen sich auch etwas längere Meldungen übersichtlich gestalten.

Re: Messagerequester vereinfachen, wie?

Verfasst: 11.07.2015 17:03
von uweb
oder so:

Code: Alles auswählen

EnableExplicit

Procedure GetPidFromName(Name.s)
  Protected result
  Protected Process.PROCESSENTRY32
  Protected ProcSnap = CreateToolhelp32Snapshot_(#TH32CS_SNAPPROCESS, 0)
  If ProcSnap <> #ERROR_INVALID_HANDLE
    Process\dwsize = SizeOf(PROCESSENTRY32)
    If Process32First_(ProcSnap, Process) = #True
      While Process32Next_(ProcSnap, Process) <> #False
        If Trim(PeekS(@Process\szExeFile,#MAX_PATH)) = Name.s
          result = Process\th32ProcessID
          Break
        EndIf
      Wend
    EndIf
    CloseHandle_(ProcSnap)
  EndIf
  ProcedureReturn result
EndProcedure

Procedure TerminateProcess(Name.s, ExitCode = 0)
  Protected result
  Protected processID = GetPidFromName(Name.s)
  If processID
    Protected hProcess  = OpenProcess_(#PROCESS_TERMINATE, #False, processID)
    If hProcess
      If TerminateProcess_(hProcess, ExitCode)
        result = #True
      EndIf
      CloseHandle_(hProcess)
    EndIf
  EndIf
  ProcedureReturn result
EndProcedure

Procedure.s TerminateProcessMessageText(Name.s)
  Protected result.s
  If TerminateProcess(Name.s)
    ProcedureReturn Name+" was successfully terminated"+#LF$
  Else
    ProcedureReturn  "Failed to terminate "+Name+#LF$
  EndIf
EndProcedure

MessageRequester("",TerminateProcessMessageText("CCleaner64.exe")+TerminateProcessMessageText("Eraser.exe")+TerminateProcessMessageText("flux.exe"),0)
... dabei habe ich doch extra nach CHR(13) gesucht :)
trotzdem Danke fürs #LF$

Re: Messagerequester vereinfachen, wie?

Verfasst: 11.07.2015 19:36
von Zerosurf
So, jetzt hab ich den Code nochmal angepasst, aber jetzt hab ich wieder das selbe Problem, wie vorher - jetzt zeigt er mir wieder jede MessageRequester einzeln an - hier der Code:

Code: Alles auswählen

EnableExplicit

Procedure GetPidFromName(Name.s)
  Protected result
  Protected Process.PROCESSENTRY32
  Protected ProcSnap = CreateToolhelp32Snapshot_(#TH32CS_SNAPPROCESS, 0)
  If ProcSnap <> #ERROR_INVALID_HANDLE
    Process\dwsize = SizeOf(PROCESSENTRY32)
    If Process32First_(ProcSnap, Process) = #True
      While Process32Next_(ProcSnap, Process) <> #False
        If Trim(PeekS(@Process\szExeFile,#MAX_PATH)) = Name.s
          result = Process\th32ProcessID
          Break
        EndIf
      Wend
    EndIf
    CloseHandle_(ProcSnap)
  EndIf
  ProcedureReturn result
EndProcedure

Procedure TerminateProcess(Name.s, ExitCode = 0)
  Protected result
  Protected processID = GetPidFromName(Name.s)
  If processID
    Protected hProcess  = OpenProcess_(#PROCESS_TERMINATE, #False, processID)
    If hProcess
      If TerminateProcess_(hProcess, ExitCode)
        result = #True
      EndIf
      CloseHandle_(hProcess)
    EndIf
  EndIf
  ProcedureReturn result
EndProcedure

Procedure.s TerminateProcessMessageText(Name.s)
  Protected result.s
  If TerminateProcess(Name.s)
    ProcedureReturn Name+" was successfully terminated"+#LF$
  Else
    ProcedureReturn  "Failed to terminate "+Name+#LF$
  EndIf
EndProcedure

; MessageRequester("",TerminateProcessMessageText("CCleaner64.exe")+TerminateProcessMessageText("Eraser.exe")+TerminateProcessMessageText("flux.exe"),0)

Dim tokill.s(2)
tokill(0) = "CCleaner64.exe"
tokill(1) = "Eraser.exe"
tokill(2) = "flux.exe"

Define x

For x.i = 0 To 2
  MessageRequester("",TerminateProcessMessageText(tokill(x)),0)
Next x


Was mach ich falsch?

Re: Messagerequester vereinfachen, wie?

Verfasst: 11.07.2015 20:33
von Nino
Zerosurf hat geschrieben:So, jetzt hab ich den Code nochmal angepasst, aber jetzt hab ich wieder das selbe Problem, wie vorher - jetzt zeigt er mir wieder jede MessageRequester einzeln an
Ja, weil Du es halt so programmiert hast. :-)
Zerosurf hat geschrieben:Was mach ich falsch?
Sorry, aber noch einfacher als hier oben kann ich es nicht erklären. Statt immer gleich den betr. Text in einem MessageRequester anzuzeigen, werden alle anzuzeigenden Texte erstmal in einer Stringvariablen gesammelt, und zum Schluss wird für den gesamten Text dann nur 1x ein MessageRequester aufgerufen.

Wenn Du meinen obigen Code nicht auf Dein Problem übertragen kannst, musst Du Dich vielleicht erstmal mehr mit ein paar Grundlagen beschäftigen, z.B. was Variablen sind und wie man sie verwendet.

Ich werde den fertigen Code nicht für Dich schreiben, Du würdest dann nicht so viel lernen.

Re: Messagerequester vereinfachen, wie?

Verfasst: 11.07.2015 20:44
von Zerosurf
funktioniert das auch mit dem array?

Re: Messagerequester vereinfachen, wie?

Verfasst: 11.07.2015 20:47
von Nino
Es gibt bestimmt ein halbes Dutzend Möglichkeiten das zu implementieren (auch mit einem Array).
Ich würde es so einfach wie möglich machen -- noch ein drittes Mal werde ich es nicht erklären.

Re: Messagerequester vereinfachen, wie?

Verfasst: 11.07.2015 20:53
von Zerosurf
Egal, ich muss halt jetzt jedesmal OK bestätigen - ist halt nicht so fein, aber falls jemand eine Lösung für mich hat, wo ich nur ein Messagerequester angezeigt bekomme, würde ich mich sehr über diese freuen!

Das ist jetzt der Code:

Code: Alles auswählen

EnableExplicit

Procedure GetPidFromName(Name.s)
  Protected result
  Protected Process.PROCESSENTRY32
  Protected ProcSnap = CreateToolhelp32Snapshot_(#TH32CS_SNAPPROCESS, 0)
  If ProcSnap <> #ERROR_INVALID_HANDLE
    Process\dwsize = SizeOf(PROCESSENTRY32)
    If Process32First_(ProcSnap, Process) = #True
      While Process32Next_(ProcSnap, Process) <> #False
        If Trim(PeekS(@Process\szExeFile,#MAX_PATH)) = Name.s
          result = Process\th32ProcessID
          Break
        EndIf
      Wend
    EndIf
    CloseHandle_(ProcSnap)
  EndIf
  ProcedureReturn result
EndProcedure

Procedure TerminateProcess(Name.s, ExitCode = 0)
  Protected result
  Protected processID = GetPidFromName(Name.s)
  If processID
    Protected hProcess  = OpenProcess_(#PROCESS_TERMINATE, #False, processID)
    If hProcess
      If TerminateProcess_(hProcess, ExitCode)
        result = #True
      EndIf
      CloseHandle_(hProcess)
    EndIf
  EndIf
  ProcedureReturn result
EndProcedure

Procedure.s TerminateProcessMessageText(Name.s)
  Protected result.s
  If TerminateProcess(Name.s)
    ProcedureReturn Name+" was successfully terminated"+#LF$
  Else
    ProcedureReturn  "Failed to terminate "+Name+#LF$
  EndIf
EndProcedure

Dim tokill.s(10)
tokill(0) = "CCleaner64.exe"
tokill(1) = "Eraser.exe"
tokill(2) = "flux.exe"
tokill(3) = "iTunesHelper.exe"
tokill(4) = "MonitorSwitcher.exe"
tokill(5) = "WDDMStatus.exe"
tokill(6) = "KLM.exe"
tokill(7) = "HD-Agent.exe"
tokill(8) = "nvtray.exe"
tokill(9) = "QHSafeTray.exe"
tokill(10) = "VGAOCAP.exe"

Define.i x

For x = 0 To 10
  MessageRequester("Termination Status",TerminateProcessMessageText(tokill(x)),0)
Next x
Nino, vielleicht wärst ja du doch so nett, und könntest mir die Lösung posten - vor allem weil sie so einfach scheint und ich schon die ganze Zeit daran tüfftel, aber trotzdem nichts schaffe!