Prozessliste mit Fensterhandle

Fragen rund um diverse Windows-Versionen, ihr Verhalten unter Xbase++ und den Umgang mit der API

Moderator: Moderatoren

Antworten
stevie
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 417
Registriert: Mo, 17. Sep 2007 18:20
Wohnort: Senftenberg
Kontaktdaten:

Prozessliste mit Fensterhandle

Beitrag von stevie »

Also ich hab mir die Funktion checkProcessTask von Lewi mal noch ein wenig geändert und will jetzt die Prozessliste als Array zurückbekommen.
Das funktioniert auch schon soweit.

Code: Alles auswählen

// Funktion gibt Prozessliste zurück
Function getProcessList(lWin)
   Local aProcesses  := space(10240)
   Local aModules    := space(4*10)
   Local cbNeeded    := 0
   Local cbNeeded2   := 0
   LOcal cname       := space(64)
   Local lIsKill     := .F.
   Local nPid
   Local nProcHandle
   Local i,nMax
   LOcal hmod,nPidId
   Local xRet,aProcess:={}
   Local lStillRunning := .F.

   EnumProcesses( @aProcesses, LEN(aProcesses) , @cbNeeded )
   nMax := len(trim(aProcesses))/4
   for i:= 1 to nMax
      nPid := Bin2U(substr(aProcesses,1+((i-1)*4),4))
      if nPidId==NIL .or. (nPIdId==nPid)
         nProcHandle  := OpenProcess( PROCESS_QUERY_INFORMATION + PROCESS_VM_READ ,0, nPid )
         if nProcHandle > 0
            if  EnumProcessModules( nProcHandle, @aModules,len(aModules)/4, @cbNeeded2) != 0
               cName := space(128)
               GetModuleBaseNameA( nProcHandle,bin2u(substr(aModules,1,4)),@cName,len(cName))
               cName := strtran(cname,chr(0),"")
               CloseHandle(nProcHandle)
               cName:=upper(alltrim(cName))
               AAdd(aProcess,cName)
            endif
         endif
      endif
   next
RETURN aProcess
Jetzt würde ich aber ganz gerne noch außer der exe ein Fensterhandle zurückbekommen, damit ich die Liste auf die sichtbaren Fenster reduzieren kann und trotzdem auf Fenster Zugriff habe.
Also zum Bsp.: {"winword.exe",47465774} {Prozessname,Fensterhandle}
Nun wird ja in der Funktion ein ProcessHandle und eine ProzessId erzeugt.
Wie kann ich denn nun aus dem Processhandle oder der ProcessID das Fensterhandle herausfinden bzw. geht das überhaupt?
Viele Grüße
Stevie
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Prozessliste mit Fensterhandle

Beitrag von AUGE_OHR »

stevie hat geschrieben:Jetzt würde ich aber ganz gerne noch außer der exe ein Fensterhandle zurückbekommen, damit ich die Liste auf die sichtbaren Fenster reduzieren kann und trotzdem auf Fenster Zugriff habe.
Ich habe mir deinen Source noch nicht "genau" angesehen, aber deine Frage kann man mit JA beantworten.

Code: Alles auswählen

FUNCTION gettasklist( hWnd )
LOCAL aList       := {}
LOCAL cWindowName
LOCAL nVisible
   DO WHILE hWnd != 0
      cWindowname := SPACE( 100 )
      IF ( getwindowtexta( hWnd, @cWindowName, LEN( cWindowName ) ) <> 0 )
         nVisible := IsWindowVisible( hWnd )
         IF nVisible == 1
            AADD( aList, STR( hWnd, 8 ) + cWindowname )
         ENDIF
      ENDIF
      hWnd = GetWindow( hWnd, GW_HWNDNEXT )
   ENDDO
RETURN aList

FUNCTION IsWindowVisible( hWnd )
LOCAL nDll := DllLoad( "USER32.DLL" )
LOCAL xRet := DllCall( nDll, DLL_STDCALL, "IsWindowVisible", hWnd )
   DllUnLoad( nDll )
RETURN xRet
gruss by OHR
Jimmy
stevie
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 417
Registriert: Mo, 17. Sep 2007 18:20
Wohnort: Senftenberg
Kontaktdaten:

Re: Prozessliste mit Fensterhandle

Beitrag von stevie »

Hi Auge_Ohr,
also mir gehts ja hauptsächlich um Is_WindowVisible.
Also entweder ich kann über gettasklist den Exe-Namen rausfinden, so bekommt man ja nur Fenstertitel und FensterHandle oder ich kann über getProcesslist aus dem Processhandle oder der ProcessId, dass Fensterhandle bekommen, um dann isWindowVisible anwenden zu können.
Viele Grüße
Stevie
Antworten