ProcessID - geht nur bei einthreadigen Anwendungen ¿?

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

ProcessID - geht nur bei einthreadigen Anwendungen ¿?

Beitrag von bobobo »

folgender Code funktioniert wunderbar ..
Aber ersetze ich notepad.exe (oder ein anderes einthreadiges Programm wie calc und was sonst alles so
gerne als Demo genommen wird) durch Excel.exe oder Windword.exe oder Firefox.exe dann scheitert
ProgramID(..), das dann immer -1 zurückgibt und damit die Ermittlung des Processhandles scheitert.

Kann man das ProcessHandle immer korrekt ermitteln ?

Code: Alles auswählen

Procedure SetPriority(ProgramID.l, PriorityLevel.l)
  Protected ProcessHandle.l

  ProcessHandle = OpenProcess_(#PROCESS_DUP_HANDLE + #PROCESS_SET_INFORMATION, #True, ProgramID)
  If ProcessHandle
    SetPriorityClass_(ProcessHandle, PriorityLevel)
    CloseHandle_(ProcessHandle)
  EndIf
EndProcedure

Result = RunProgram("Notepad.exe", "", "", #PB_Program_Open)

If Result
  Debug Result
  Debug ProgramID(Result)
  SetPriority(ProgramID(Result), #IDLE_PRIORITY_CLASS)     ; niedrige Prioritätsstufe
  MessageRequester("","")
  KillProgram(Result)
  CloseProgram(Result)
EndIf
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: ProcessID - geht nur bei einthreadigen Anwendungen ¿?

Beitrag von NicTheQuick »

Von vielen Programmen laufen schon Prozesse im Hintergrund, denen dann nur noch gesagt wird, dass sie in neues Fenster öffnen sollen. Kurz darauf wird der eigentlich gestartete Prozess wieder beendet. Deswegen findest du dann keine Prozess-ID mehr.
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: ProcessID - geht nur bei einthreadigen Anwendungen ¿?

Beitrag von bobobo »

Und wie finde ich die dann ?
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: ProcessID - geht nur bei einthreadigen Anwendungen ¿?

Beitrag von RSBasic »

Code: Alles auswählen

EnableExplicit

Define ProcessID

#kExit_Code_Error=1
#kExit_Code_Success=0

Procedure SetPriority(ProgramID.l, PriorityLevel.l)
  Protected ProcessHandle.l

  ProcessHandle = OpenProcess_(#PROCESS_DUP_HANDLE | #PROCESS_SET_INFORMATION, #True, ProgramID)
  If ProcessHandle
    SetPriorityClass_(ProcessHandle, PriorityLevel)
    CloseHandle_(ProcessHandle)
  EndIf
EndProcedure

Procedure GetProcessId_(hProcess)
  Static *pGetProcessId
 
  If Not *pGetProcessId
    *pGetProcessId=GetProcAddress_(GetModuleHandle_("kernel32.dll"),"GetProcessId")
  EndIf
 
  If Not *pGetProcessId
    ProcedureReturn 0
  EndIf
 
  ProcedureReturn CallFunctionFast(*pGetProcessId,hProcess)
EndProcedure

Procedure RunProgram_(ProgramName.s, Parameter.s="", WorkingDirectory.s="", Visible=#SW_SHOW)
  Protected ShellExInfo.SHELLEXECUTEINFO
 
  ShellExInfo\cbSize=SizeOf(ShellExInfo)
  ShellExInfo\fMask=#SEE_MASK_NOCLOSEPROCESS
  ShellExInfo\lpVerb=@"Open"
  ShellExInfo\lpFile=@ProgramName.s
  ShellExInfo\lpParameters=@Parameter.s
  ShellExInfo\lpDirectory=@WorkingDirectory.s
  ShellExInfo\nShow=Visible
 
  ShellExecuteEx_(@ShellExInfo)
 
  ProcedureReturn GetProcessId_(ShellExInfo\hProcess)
EndProcedure

ProcessID = RunProgram_("winword.exe")
Debug ProcessID
If ProcessID
  SetPriority(ProcessID, #IDLE_PRIORITY_CLASS)
EndIf
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: ProcessID - geht nur bei einthreadigen Anwendungen ¿?

Beitrag von ts-soft »

Code: Alles auswählen

#PROCESS_DUP_HANDLE + #PROCESS_SET_INFORMATION
ist in diesem Falle zwar dasselbe wie:

Code: Alles auswählen

#PROCESS_DUP_HANDLE | #PROCESS_SET_INFORMATION
aber ... :wink:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: ProcessID - geht nur bei einthreadigen Anwendungen ¿?

Beitrag von RSBasic »

Habs angepasst. Danke Thomas. :D
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: ProcessID - geht nur bei einthreadigen Anwendungen ¿?

Beitrag von bobobo »

sehr schön :allright: .. aber nur mit ohne Unicode (was nicht so wild ist)
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: ProcessID - geht nur bei einthreadigen Anwendungen ¿?

Beitrag von ts-soft »

bobobo hat geschrieben:sehr schön :allright: .. aber nur mit ohne Unicode (was nicht so wild ist)

Code: Alles auswählen

EnableExplicit

Define ProcessID

#kExit_Code_Error=1
#kExit_Code_Success=0

Procedure SetPriority(ProgramID.l, PriorityLevel.l)
  Protected ProcessHandle.l

  ProcessHandle = OpenProcess_(#PROCESS_DUP_HANDLE | #PROCESS_SET_INFORMATION, #True, ProgramID)
  If ProcessHandle
    SetPriorityClass_(ProcessHandle, PriorityLevel)
    CloseHandle_(ProcessHandle)
  EndIf
EndProcedure

Procedure GetProcessId_(hProcess)
  Static *pGetProcessId
  Protected *func = AllocateMemory(13)
  PokeS(*func, "GetProcessId", -1, #PB_Ascii)
  If Not *pGetProcessId
    *pGetProcessId=GetProcAddress_(GetModuleHandle_("kernel32.dll"),*func)
  EndIf
 
  If Not *pGetProcessId
    ProcedureReturn 0
  EndIf
  FreeMemory(*func)
  ProcedureReturn CallFunctionFast(*pGetProcessId,hProcess)
EndProcedure

Procedure RunProgram_(ProgramName.s, Parameter.s="", WorkingDirectory.s="", Visible=#SW_SHOW)
  Protected ShellExInfo.SHELLEXECUTEINFO
 
  ShellExInfo\cbSize=SizeOf(ShellExInfo)
  ShellExInfo\fMask=#SEE_MASK_NOCLOSEPROCESS
  ShellExInfo\lpVerb=@"Open"
  ShellExInfo\lpFile=@ProgramName.s
  ShellExInfo\lpParameters=@Parameter.s
  ShellExInfo\lpDirectory=@WorkingDirectory.s
  ShellExInfo\nShow=Visible
 
  ShellExecuteEx_(@ShellExInfo)
 
  ProcedureReturn GetProcessId_(ShellExInfo\hProcess)
EndProcedure

ProcessID = RunProgram_("textmaker.exe")
Debug ProcessID
If ProcessID
  SetPriority(ProcessID, #IDLE_PRIORITY_CLASS)
EndIf 
Ohne / Mit Unicode :mrgreen:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten