From: Heesob Park Date: 2008-09-30T14:43:18+09:00 Subject: Re: screen capture to display it or to save it to a file possible? 2008/9/30 liketofindoutwhy : > On Sep 28, 1:46 pm, Tim Hunter wrote: >> liketofindoutwhy wrote: >> > On Sep 28, 11:29 am, liketofindoutwhy >> > wrote: >> >> i would like do screencaptureand then to display it in that app's >> >> window, or be able to save the file in hard disk as a GIF or PNG. I >> >> wonder if TCL Ruby or RMagick can already do that? Thanks. >> >> > oh i actually mean Ruby/Tk >> >> RMagick can do it on systems that have X Window. In other words, not MS >> Windows.http://studio.imagemagick.org/RMagick/doc/image1.html#capture. > > hm... so can you install x-window capabilities on XP or Vista... will > that work? I think the Cygwin install x-window capabilities on > Windows. > > > There is screen_capture method in watir. But it is unstable. Here is the revised screen_capture method for Windows: require 'win32ole' require 'Win32API' def screen_capture(filename, active_window_only=false) keybd_event = Win32API.new("user32", "keybd_event", ['I','I','L','L'], 'V') openClipboard = Win32API.new('user32', 'OpenClipboard', ['L'], 'I') setClipboardData = Win32API.new('user32', 'SetClipboardData', ['I', 'I'], 'I') closeClipboard = Win32API.new('user32', 'CloseClipboard', [], 'I') globalAlloc = Win32API.new('kernel32', 'GlobalAlloc', ['I', 'I'], 'I') globalLock = Win32API.new('kernel32', 'GlobalLock', ['I'], 'I') globalUnlock = Win32API.new('kernel32', 'GlobalUnlock', ['I'], 'I') memcpy = Win32API.new('msvcrt', 'memcpy', ['I', 'P', 'I'], 'I') wsh = WIN32OLE.new('Wscript.Shell') if not active_window_only keybd_event.Call(0x2C,0,0,0) # Print Screen else keybd_event.Call(0x2C,1,0,0) # Alt+Print Screen end exec = wsh.Exec('mspaint.exe') wsh.AppActivate(exec.ProcessID) sleep(1) # Ctrl + V : Paste wsh.SendKeys("^v") sleep(1) # Alt F + A : Save As wsh.SendKeys("%fa") # copy filename to clipboard hmem = globalAlloc.Call(0x0002, filename.length+1) mem = globalLock.Call(hmem) memcpy.Call(mem, filename, filename.length+1) globalUnlock.Call(hmem) openClipboard.Call(0) setClipboardData.Call(1, hmem) closeClipboard.Call sleep(1) # Ctrl + V : Paste wsh.SendKeys("^v") if filename[/\.gif/i] wsh.SendKeys("{TAB}g") elsif filename[/\.jpg/i] wsh.SendKeys("{TAB}j") end wsh.SendKeys("~") # enter sleep(1) wsh.SendKeys("yy") sleep(4) exec.Terminate end screen_capture("c:\\test.gif") Regards, Park Heesob