calling winapi for EnumDisplayMonitors

P

Phil Smy

I am trying to write a desktop application in Ruby. We need to find out
what monitors are attached to the XP machine this will run on.
I looked at how SWT does this and it is accomplished via calling
EnumDisplayMonitors (windows api).

I cannot figure out how to call this from within Ruby using Win32API.
EnumDisplayMonitors's api is this:
BOOL EnumDisplayMonitors(
HDC hdc,
LPCRECT lprcClip,
MONITORENUMPROC lpfnEnum,
LPARAM dwData
);

How can I supply a proc? Is what I want to do even possible?

Any help would be appreciated. All this kind of stuff is not very
clearly documented for the novice and I can't find any relevant samples.
 
H

Heesob Park

Hi,

2009/5/6 Phil Smy said:
I am trying to write a desktop application in Ruby. We need to find out
what monitors are attached to the XP machine this will run on.
I looked at how SWT does this and it is accomplished via calling
EnumDisplayMonitors (windows api).

I cannot figure out how to call this from within Ruby using Win32API.
EnumDisplayMonitors's api is this:
BOOL EnumDisplayMonitors(
=C2=A0HDC hdc,
=C2=A0LPCRECT lprcClip,
=C2=A0MONITORENUMPROC lpfnEnum,
=C2=A0LPARAM dwData
);

How can I supply a proc? Is what I want to do even possible?

Any help would be appreciated. All this kind of stuff is not very
clearly documented for the novice and I can't find any relevant samples.

As you know, Win32API doesn't support callback.
Try with Ruby/DL or win32-api gem.

Here is a win32-api sample:

require 'win32/api'

EnumDisplayMonitors =3D Win32::API.new('EnumDisplayMonitors', 'LPKL',
'B', 'user32')
GetMonitorInfo =3D Win32::API.new('GetMonitorInfo', 'LP', 'B', 'user32')

MyInfoEnumProc =3D Win32::API::Callback.new('LLPL','L') {
|hMonitor,hdcMonitor,lprcMonitor,dwData|
lpmi =3D [72].pack('L') + 0.chr * 68
GetMonitorInfo.call(hMonitor,lpmi)
info =3D lpmi.unpack('L10Z*')
puts "Name:#{info[10]}, Width:#{info[3]}, Height:#{info[4]} "
1
}

EnumDisplayMonitors.call(0, nil, MyInfoEnumProc, 0)


Regards,
Park Heesob
 
R

Roger Pack

Phil said:
I am trying to write a desktop application in Ruby. We need to find out
what monitors are attached to the XP machine this will run on.
I looked at how SWT does this and it is accomplished via calling
EnumDisplayMonitors (windows api).

Ruby wmi is also quite nice (dunno if it helps here though).
http://betterlogic.com/roger/?p=1291
 
P

Phil Smy

Hi Park,
In short - you rule!
Thanks - this does exactly what we need. I guess I need to do some
reading up on win32-api to understand HOW it does it, but this is a
great start.
Much appreciated.

Heesob said:
Here is a win32-api sample:

require 'win32/api'

EnumDisplayMonitors = Win32::API.new('EnumDisplayMonitors', 'LPKL',
'B', 'user32')
GetMonitorInfo = Win32::API.new('GetMonitorInfo', 'LP', 'B', 'user32')

MyInfoEnumProc = Win32::API::Callback.new('LLPL','L') {
|hMonitor,hdcMonitor,lprcMonitor,dwData|
lpmi = [72].pack('L') + 0.chr * 68
GetMonitorInfo.call(hMonitor,lpmi)
info = lpmi.unpack('L10Z*')
puts "Name:#{info[10]}, Width:#{info[3]}, Height:#{info[4]} "
1
}

EnumDisplayMonitors.call(0, nil, MyInfoEnumProc, 0)


Regards,
Park Heesob
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,007
Latest member
obedient dusk

Latest Threads

Top