From: ptkwt@...1.aracnet.com (Phil Tomson) Date: 2001-04-13T10:10:03+09:00 Subject: [ruby-talk:13630] Win32API: GenerateConsoleCtrlEvent not working under NT? Here's one for the Win32 gurus out there. I'm trying to make a timed system command under Windows that sends a CONTROL-C (^C) to the program that it spawns after a specified amount of time has passed. Here's the code I have now: ######################start of code################3 require 'Win32API' require 'timeout' CREATE_NEW_CONSOLE = 0x10 CREATE_NEW_PROCESS_GROUP = 0x00000200 DETACHED_PROCESS = 0x08 WAIT_TIMEOUT = 0x102 CTRL_C_EVENT = 0 CreateProcess = Win32API.new("kernel32","CreateProcess",['L','P','L','L','L','L','L','L','P','P'],'L') GetExitCodeProcess = Win32API.new("kernel32","GetExitCodeProcess",['L','P'],'L') WaitForSingleObject = Win32API.new("kernel32","WaitForSingleObject",['L','L'],'L') TerminateProcess = Win32API.new("kernel32","TerminateProcess",['L','L'],'L') CloseHandle = Win32API.new("kernel32","CloseHandle",['L'],'L') GenerateConsoleCtrlEvent = Win32API.new("kernel32","GenerateConsoleCtrlEvent",['L','L'],'L') def timedSystemCommand( command, redirFile, time=100 ) puts "command is: #{command}\n" fputc = Win32API.new("crtdll","fputc", ['L','L'],'L') killed = 0 exitcode = "\0" * 32 si = [68].pack("L") + "\0" * 64 pi = "\0" * 16; ###### if redirFile tmpfile = File.new("tmp","w") save_stdout = $stdout.clone $stdout.reopen(tmpfile) end CreateProcess.Call(0,"#{command}",0,0,1,CREATE_NEW_PROCESS_GROUP,0,0,si,pi) hProcess = pi.unpack("LLLL")[0] hThread = pi.unpack("LLLL")[1] dwProcessId = pi.unpack("LLLL")[2] dwThreadId = pi.unpack("LLLL")[3] a = WaitForSingleObject.Call( hProcess, time*1000 ) if a==WAIT_TIMEOUT puts "got a timeout error" puts "send ^C!" GenerateConsoleCtrlEvent.Call(CTRL_C_EVENT, dwProcessId ) killed = 1 end GetExitCodeProcess.Call(hProcess, exitcode) exitcode = exitcode.unpack("L") CloseHandle.Call(hProcess) if redirFile $stdout.reopen(save_stdout) end save_stdout.close if save_stdout return killed, exitcode end #########################end of code############################ On Windows 98 the above code works fine. Under Windows NT and 2000, however, the program gets launched and the timeout condition happens, but the CTRL_C_EVENT that is supposed to be sent by GenerateConsoleCtrlEvent is never received (or sent, maybe?) so the application continues on it's merry way and is not killed. WinNT/2000 should be able to handle all of these functions OK - could it be a problem with Cygwin?. I also tried a C version of the above (a C Ruby extension) and got the same results on NT (again I was using Cygwin to compile). Phil