Thanks, I will try it out this weekend, and let you know if there any problems.
-----Original Message-----
From: Aaron Ballman [mailto:aaron at realsoftware dot com]
Sent: Thursday, December 30, 2004 4:53 PM
To: REALbasic NUG
Subject: Re: Managing Processes
Moore, Willie wrote:
>
> I'll see if I can whip something up, assuming that this is what you are
> trying to do. Just to make sure -- you want to know what process owns
> the frontmost window, just the name of the process or something?
>
> This is exactly what I am trying to do, and any help you can provide would be
> greatly appreciated.
Here ya go (also added for the next release of the Windows Functionality
Suite).
Function GetFrontmostWindowHandle() as Integer
#if TargetWin32
Declare Function GetForegroundWindow Lib "User32" () as Integer
return GetForegroundWindow
#endif
End Function
Function GetActiveProcesses() as ProcessInformation()
#if TargetWin32
Declare Function CreateToolhelp32Snapshot Lib "Kernel32" (flags as
Integer, id as Integer ) as Integer
Declare Sub CloseHandle Lib "Kernel32" ( handle as Integer )
Declare Sub Process32First Lib "Kernel32" ( handle as Integer,
entry as Ptr )
Declare Function Process32Next Lib "Kernel32" ( handle as Integer,
entry as Ptr ) as Boolean
dim snapHandle as Integer
snapHandle = CreateToolhelp32Snapshot( 2, 0 )
dim mb as new MemoryBlock( 260 + 36 )
dim entry as ProcessInformation
dim ret() as ProcessInformation
mb.Long( 0 ) = mb.Size
Process32First( snapHandle, mb )
dim err as Integer = GetLastError
do
entry = new ProcessInformation( mb )
ret.Append( entry )
Call Process32Next( snapHandle, mb )
loop until GetLastError() = 18
CloseHandle( snapHandle )
return ret
#endif
End Function
Function GetFrontmostWindowProcessInformation() as ProcessInformation
#if TargetWin32
// We want to get the frontmost window based
dim frontWindowHWND as Integer
frontWindowHWND = GetFrontmostWindowHandle
if frontWindowHWND <= 0 then return nil
// Now figure out what process ID owns the window
Declare Sub GetWindowThreadProcessId Lib "User32" ( hwnd as
Integer, ByRef procId as Integer )
dim processID as Integer
GetWindowThreadProcessId( frontWindowHWND, processId )
// Now we get a list of all the processes, and see if we can find
// one with a match.
dim processes(-1) as ProcessInformation
processes = GetActiveProcesses
dim ret as ProcessInformation
for each ret in processes
if ret.ProcessID = processID then
return ret
end if
next
#endif
End Function
And finally, the class ProcessInformation. Here's the constructor, you
can figure out the public class properties from it as well.
Constructor( mb as MemoryBlock )
// Construct one from a memory block
// First four bytes are the size of the structure, so
// just ignore them.
// Four bytes of reference count
ReferenceCount = mb.Long( 4 )
// Four bytes of process id
ProcessID = mb.Long( 8 )
// Pointer to the default heap id
if mb.Long( 12 ) <> 0 then
DefaultHeapID = mb.Ptr( 12 ).Long( 0 )
end if
// Module ID
ModuleID = mb.Long( 16 )
// Number of threads
NumberOfThreads = mb.Long( 20 )
// Parent id
ParentProcessID = mb.Long( 24 )
// The base priority for threads
BaseThreadPriority = mb.Long( 28 )
// Ignore the next four bytes, they're
// reserved.
// And finally, the name
Name = mb.CString( 36 )
if Name = "[System Process]" then Name = "System Idle Process"
End Sub
Enjoy!
~Aaron
_______________________________________________
Unsubscribe or switch delivery mode:
<http://www.realsoftware.com/support/listmanager/>
Search the archives of this list here:
<http://support.realsoftware.com/listarchives/lists.html>
_______________________________________________
Unsubscribe or switch delivery mode:
<http://www.realsoftware.com/support/listmanager/>
Search the archives of this list here:
<http://support.realsoftware.com/listarchives/lists.html>
|