>function do_it() > > ?ProcessTerminate(1108, 5) >endfunc >*-------------------------------------------------------------------------- > >#define PROCESS_ALL_ACCESS (0x000F0000 + 0x00100000 + 0x0FFF) > >#define WM_CLOSE 0x0010 > >#DEFINE GW_HWNDFIRST 0 >#define GW_HWNDNEXT 2 >#define GW_OWNER 4 >#define GW_CHILD 5 >#define GW_ENABLEDPOPUP 6 > >#define STATUS_WAIT_0 0x00000000 >#define STATUS_ABANDONED_WAIT_0 0x00000080 >#define STATUS_TIMEOUT 0x00000102 > > >#define WAIT_FAILED (-1) >#define WAIT_OBJECT_0 STATUS_WAIT_0 >#define WAIT_ABANDONED STATUS_ABANDONED_WAIT_0 >#define WAIT_TIMEOUT STATUS_TIMEOUT > >function ProcessTerminate(ProcessId, grace) > > declare long OpenProcess in win32api ; > long dwDesiredAccess, integer bInheritHandle, long pid > > declare integer CloseHandle in win32api long Handle > > declare long WaitForSingleObject in win32api ; > long handle, long MilliSeconds > > declare integer TerminateProcess in Kernel32.dll long, long > declare integer PostMessage in user32.dll long, long, long, long > > declare long GetWindowThreadProcessId in user32.dll long, long@ > > declare integer GetWindow in Win32API integer, integer > > local Success > Success = TRUE > > local ProcessHandle, WaitExitStatus > local WindowArray[1], nWindowArray, i > > grace = iif(empty(m.grace), 5000, m.grace * 1000) > > do case > case !m.Success > > otherwise > ProcessHandle = OpenProcess(PROCESS_ALL_ACCESS, 0, m.ProcessId) > > endcase > > do case > case !m.Success > > case empty(m.ProcessHandle) && not there > Success = FALSE > assert FALSE > > otherwise > = ProcessWindowList(m.ProcessId, @WindowArray, @nWindowArray) > > for i = 1 to m.nWindowArray > =PostMessage(WindowArray[m.i], WM_CLOSE, 0, 0) > endfor > endcase > > do case > case !m.Success > > > otherwise > WaitExitStatus = WaitForSingleObject(m.ProcessHandle, m.Grace) > > do case > case m.WaitExitStatus = WAIT_OBJECT_0 > && ok > > case m.WaitExitStatus = WAIT_FAILED > pp=getlasterror() > ?LastError_Format(pp) > assert FALSE > Success = FALSE > > case empty(m.WaitExitStatus) && gone > assert FALSE > > case empty(TerminateProcess(m.ProcessHandle, 0)) > Success = FALSE > assert FALSE > > otherwise > ?'forced' > endcase > > endcase > > = empty(m.ProcessHandle) or !empty(CloseHandle(m.ProcessHandle)) > > return m.Success > >endfunc >*--------------------------------------------------------------------------- >function LastError_Format(LastError) > > declare Integer FormatMessage in win32api ; > Integer dwFlags, ; > string @lpSource, ; > Integer dwMessageId, ; > Integer dwLanguageId, ; > string @lpBuffer, ; > Integer nSize, ; > Integer > > local n, buf > buf = space(1024) > > #define FORMAT_MESSAGE_ALLOCATE_BUFFER 0x00000100 > #define FORMAT_MESSAGE_IGNORE_INSERTS 0x00000200 > #define FORMAT_MESSAGE_FROM_STRING 0x00000400 > #define FORMAT_MESSAGE_FROM_HMODULE 0x00000800 > #define FORMAT_MESSAGE_FROM_SYSTEM 0x00001000 > #define FORMAT_MESSAGE_ARGUMENT_ARRAY 0x00002000 > #define FORMAT_MESSAGE_MAX_WIDTH_MASK 0x000000FF > > n = FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM, ; > 0, ; > m.LastError, ; > 0, ; > @m.buf, ; > len(m.buf), ; > 0 ; > ) > > local msg > msg = 'Error ' + ltrim(str(m.LastError, 18, 0)) > do case > case !empty(m.n) > msg = m.msg + ' : ' + left(m.buf, m.n) > endcase > > return m.msg > > #undefine FORMAT_MESSAGE_ALLOCATE_BUFFER > #undefine FORMAT_MESSAGE_IGNORE_INSERTS > #undefine FORMAT_MESSAGE_FROM_STRING > #undefine FORMAT_MESSAGE_FROM_HMODULE > #undefine FORMAT_MESSAGE_FROM_SYSTEM > #undefine FORMAT_MESSAGE_ARGUMENT_ARRAY > #undefine FORMAT_MESSAGE_MAX_WIDTH_MASK > >endfunc >*------------------------------------------------------------------------------- >function ProcessWindowList(pid, WindowArray, nWindowArray) > > external array WindowArray > > nWindowArray = 0 > dime WindowArray[65000] > > =ProcessWindowList_(m.pid, @WindowArray, @m.nWindowArray, GetDesktopWindow()) > dime WindowArray[ max(1, m.nWindowArray) ] > >endfunc >*------------------------------------------------------------------------------- >function ProcessWindowList_(pid, WindowArray, nWindowArray, hwnd) > > external array WindowArray > > local Handle, pidhwnd > pidhwnd = 0 > > Handle = GetWindow(m.hwnd, GW_CHILD) > > do while !empty(m.Handle) > > =GetWindowThreadProcessId(m.Handle, @m.pidhwnd ) > if( m.pidhwnd = m.pid ) > nWindowArray = m.nWindowArray + 1 > WindowArray[ m.nWindowArray ] = m.Handle > > && uncomment for child windows > *=ProcessWindowList_(m.pid, @WindowArray, @m.nWindowArray, m.Handle) > endif > > > Handle = GetWindow(m.Handle, GW_HWNDNEXT) > enddo >endfunc >*------------------------------------------------------------------------------- >How do you get process ID of all VFP processes?