How to do a getPixel on Win32 using Ruby?

Does someone know how to do a getPixel on Win32 using Ruby? (either to
get a pixel's color value on a window or on the whole screen). thanks.

···

--
Posted via http://www.ruby-forum.com/.

Jian Lin wrote:

Does someone know how to do a getPixel on Win32 using Ruby? (either to
get a pixel's color value on a window or on the whole screen). thanks.

ah... and also setPixel() too.

···

--
Posted via http://www.ruby-forum.com/\.

I thought it would be something like

user32 'GetPixel', ['L', 'I', 'I' ], 'L'

as in

···

-----------------------------------------------------------
require 'Win32API'

def user32(name, param_types, return_value)
  Win32API.new 'user32' , name, param_types, return_value
end

set_cursor_pos = user32 'SetCursorPos', ['L' , 'L' ], 'I'
mouse_event = user32 'mouse_event', ['L' , 'L' , 'L' , 'L' , 'L' ], 'V'

get_pixel = user32 'GetPixel', ['L', 'I', 'I' ], 'L'

get_pixel.call 0, 0, 0
-----------------------------------------------------------
but there is an error giving out

get_pixel.rb:4:in `initialize': GetProcAddress: GetPixel or GetPixelA
(RuntimeError)

        from get_pixel.rb:4:in `new'
        from get_pixel.rb:4:in `user32'
        from get_pixel.rb:10

--
Posted via http://www.ruby-forum.com/.

Jian Lin wrote:

Jian Lin wrote:

Does someone know how to do a getPixel on Win32 using Ruby? (either to
get a pixel's color value on a window or on the whole screen). thanks.

ah... and also setPixel() too.

Do you want to draw onto the screen?

If so, I think you should use a GUI toolkit, create a maximized window,
without a title bar and border, and then draw onto it. For example, in
wxRuby:

···

------------------
require "wx"

class MyApp < Wx::App
  include Wx

  def on_init
    @mainwindow = Frame.new(nil, -1, "", DEFAULT_POSITION, DEFAULT_SIZE,
MAXIMIZE)
    @mainwindow.background_colour = BLACK
    Timer.after(3000) do
      @mainwindow.paint do |dc|
        dc.pen = WHITE_PEN
        dc.draw_line(0, 0, 500, 500)
      end
    end
    Timer.after(5000){@mainwindow.close}
    @mainwindow.show
  end

end

x = MyApp.new
x.main_loop
-------------------

This creates a maximized, black window and after 3 seconds it draws a
white line from (0|0) to (500|500). After five seconds (from the
beginning) it closes the window.
Tested with ruby 1.9.1p243 (2009-07-16 revision 24175) [i386-mingw32] on
Windows Vista.

Marvin
--
Posted via http://www.ruby-forum.com/\.

Marvin Gülker wrote:

Do you want to draw onto the screen?

If so, I think you should use a GUI toolkit, create a maximized window,
without a title bar and border, and then draw onto it.

can wxRuby get a pixel's color value off from the screen too? (not
window but the screen)

···

--
Posted via http://www.ruby-forum.com/\.

Jian Lin wrote:

Marvin Gülker wrote:

Do you want to draw onto the screen?

If so, I think you should use a GUI toolkit, create a maximized window,
without a title bar and border, and then draw onto it.

can wxRuby get a pixel's color value off from the screen too? (not
window but the screen)

If you create the window like I showed, it will fill the *entire*
screen. There's nothing else than the window to see (not even the
taskbar!), so it's equivalent if you get the pixel from your window or
the screen. And so does it work:

···

-------------------------
require "wx"

class MyApp < Wx::App
  include Wx

  def on_init
    @mainwindow = Frame.new(nil, -1, "", DEFAULT_POSITION, DEFAULT_SIZE,
MAXIMIZE)
    @mainwindow.background_colour = BLACK
    Timer.after(3000) do
      @mainwindow.paint do |dc|
        dc.pen = WHITE_PEN
        dc.draw_line(0, 0, 500, 500)
        #Get the pixel color at (100|10) which should be black.
        col = Colour.new(255, 255, 255) #This means white
        dc.get_pixel(100, 10, col)
        p col #=> (0, 0, 0) #This means black
      end
    end
    Timer.after(5000){@mainwindow.close}
    @mainwindow.show
  end

end

x = MyApp.new
x.main_loop
------------------------
The #get_pixel method seems to be directly imported from C, because it
works like it would require a pointer. However, it works. The method to
set a pixel directly, is #draw_point.

Marvin
--
Posted via http://www.ruby-forum.com/\.