Hallo Markus
trotz [erledigt]-Status muss ich auch noch was dazu beitragen.
Habe das mit dem Abfragen nach dem Programmnamen (outlook.exe) und/oder Fenster-Namen ("Microsoft Outlook") auch mal gelöst und zwar so:
Code: Alles auswählen
//----------
DLLFUNCTION EnumWindows( cAddrOfUserFunc , uUserVar ) ;
Using STDCALL ;
From USER32.DLL
DLLFUNCTION GetWindowTextA( nWindowHandle , @cTitel , nTitelMax ) ;
Using STDCALL ;
From USER32.DLL
DLLFUNCTION GetWindowThreadProcessId( nWindowHandle , @lpdwProcessId ) ;
Using STDCALL ;
From USER32.DLL
DLLFUNCTION OpenProcess( dwDesiredAccess , bInheritHandle , dwProcessId ) ;
Using STDCALL ;
From KERNEL32.DLL
//----------
Function GsApiFindProcTitle( cTitleRef )
Local nHWND := GsApiFindProcess( NIL , NIL , cTitleRef )
Return( nHWND )
//----------
Function GsApiFindProcExe( cExeRef )
Local nHWND := GsApiFindProcess( NIL , cExeRef , NIL )
Return( nHWND )
//----------
Function GsApiFindProcess( bCheck , cExeRef , cTitleRef )
Privat bFind
Privat nHWND := 0
If bCheck == NIL
bCheck := { | nHWND , cWinTitle | GsApiFindProcSub2( nHWND , cWinTitle , cExeRef , cTitleRef ) }
EndIf
MEMVAR->bFind := bCheck
EnumWindows( BaCallBack( "GsApiFindProcSub1" , BA_CB_GENERIC2 ) , 0 )
Return( MEMVAR->nHWND )
//----------
Function GsApiFindProcSub1( nHandle , uPar )
Local nBuf
Local nMax := 100
Local cBuf := Space( nMax ) // Replicate( Chr( 32 ) , nMax )
Local nRet := 1
nBuf := GetWindowTextA( nHandle , @cBuf , nMax )
If nBuf > 0
If EVal( MEMVAR->bFind , nHandle , Left( cBuf , nBuf ) )
nRet := 0
MEMVAR->nHWND := nHandle
EndIf
EndIf
Return( nRet )
//----------
Function GsApiFindProcSub2( nHWND , cWinTitle , cExeRef , cTitleRef )
Local nPID := 0
Local lMatch := .F.
If cTitleRef <> NIL .And. ! Empty( cTitleRef )
If Upper( AllTrim( cTitleRef ) ) == Upper( AllTrim( cWinTitle ) )
lMatch := .T.
EndIf
ElseIf cExeRef <> NIL .And. ! Empty( cExeRef )
GetWindowThreadProcessId( nHWND , @nPID )
cProcName := GsApiProcGetProcName( nPID , .F. )
If Upper( AllTrim( cProcName ) ) == Upper( AllTrim( cExeRef ) )
lMatch := .T.
EndIf
EndIf
Return( lMatch )
//----------
Function GsApiProcGetProcName( nPID , lFullPath )
Local nHWND := 0
Local nHMod := 0
Local nCb := 0
Local nProc := 100
Local cProc := Space( nProc )
Local cProcName := ""
If lFullPath == NIL
lFullPath := .F.
EndIf
nHWND := GsApiProcGetHwndFromPid( nPID )
nRet := DllCall( "PSAPI.DLL" , DLL_STDCALL , "EnumProcessModules" , nHWND , @nHMod , 4 , @nCb )
If lFullPath
nRet := DllCall( "PSAPI.DLL" , DLL_STDCALL , "GetModuleFileNameExA" , nHWND , nHMod , @cProc , nProc ) // kompletter Pfadname z.B. "c:\programme\sfirm\sfmain.exe"
Else
nRet := DllCall( "PSAPI.DLL" , DLL_STDCALL , "GetModuleBaseNameA" , nHWND , nHMod , @cProc , nProc ) // Filename + Erweiterung z.B. "sfmain.exe"
EndIf
cProcName := Left( cProc , nRet )
CloseHandle( nHWND )
Return( cProcName )
//----------
Function GsApiProcGetHwndFromPid( nPID )
Local nHWND := OpenProcess( PROCESS_QUERY_INFORMATION + PROCESS_VM_READ , .F. , nPID )
Return( nHWND )
//----------
BAP wird benötigt,
wenn es nicht geht habe ich bestimmt eine Function vergessen, dann einfach "hupen"...
(vielleicht habe ich auch zu viel Code reinkopiert).
TESTPROGRAMM:
Code: Alles auswählen
Procedure main
Local nHWND
nHWND := GsApiFindProcTitle( "Microsoft Outlook" )
MsgBox( Var2Char( nHWND ) )
nHWND := GsApiFindProcExe( "outlook.exe" )
MsgBox( Var2Char( nHWND ) )
Return