Issue Details (XML | Word | Printable)

Key: WTR-258
Type: Improvement Improvement
Status: Open Open
Priority: Major Major
Assignee: Unassigned
Reporter: Bret Pettichord
Votes: 1
Watchers: 0
Operations

If you were logged in you would be able to see more operations.
Watir

New Screen Capture Code

Created: 30/Sep/08 09:48 AM   Updated: 07/Feb/10 11:29 AM
Component/s: None
Affects Version/s: None
Fix Version/s: Future


 Description  « Hide

From: Heesob Park <phasis@gmail.com>
Date: Tue, Sep 30, 2008 at 12:43 AM
Subject: Re: screen capture to display it or to save it to a file possible?
To: ruby-talk ML <ruby-talk@ruby-lang.org>

2008/9/30 liketofindoutwhy <liketofindoutwhy@gmail.com>:
> On Sep 28, 1:46 pm, Tim Hunter <TimHun...@nc.rr.com> wrote:
>> liketofindoutwhy wrote:
>> > On Sep 28, 11:29 am, liketofindoutwhy <liketofindout...@gmail.com>
>> > 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)

  1. Ctrl + V : Paste
    wsh.SendKeys("^v")
    sleep(1)
  2. Alt F + A : Save As
    wsh.SendKeys("%fa")
  3. 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)
  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



Sort Order: Ascending order - Click to sort in descending order
Alexey added a comment - 07/Feb/10 11:29 AM

I am using Win32::CaptureIE and it works fine. Otherwise you can try Win32::Screenshot.capture_hwnd() or Win32::Screenshot.desktop()