# Calling winapi for EnumDisplayMonitors

**URL:** <https://www.ruby-forum.com/t/calling-winapi-for-enumdisplaymonitors/167294>\
**Category:** Ruby\
**Created:** [May 6, 2009, 1:59pm UTC](https://www.ruby-forum.com/t/calling-winapi-for-enumdisplaymonitors/167294 "2009-05-06T13:59:26Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![philswenson](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/7feea3/32.png) [@philswenson](https://www.ruby-forum.com/u/philswenson)\
**Post date:** [May 6, 2009, 1:59pm UTC](https://www.ruby-forum.com/t/calling-winapi-for-enumdisplaymonitors/167294/1 "2009-05-06T13:59:26Z")

</div>

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.

---

<div class="post-metadata">

**Author:** ![philswenson](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/7feea3/32.png) [@philswenson](https://www.ruby-forum.com/u/philswenson)\
**Post date:** [May 6, 2009, 4:44pm UTC](https://www.ruby-forum.com/t/calling-winapi-for-enumdisplaymonitors/167294/2 "2009-05-06T16:44:21Z")

</div>

Hi,

2009/5/6 Phil S. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> Â 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.

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 = 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 H.

---

<div class="post-metadata">

**Author:** ![philswenson](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/7feea3/32.png) [@philswenson](https://www.ruby-forum.com/u/philswenson)\
**Post date:** [May 6, 2009, 9:21pm UTC](https://www.ruby-forum.com/t/calling-winapi-for-enumdisplaymonitors/167294/3 "2009-05-06T21:21:16Z")

</div>

Phil S. wrote:

> 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](http://betterlogic.com/roger/?p=1291)

---

<div class="post-metadata">

**Author:** ![philswenson](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/7feea3/32.png) [@philswenson](https://www.ruby-forum.com/u/philswenson)\
**Post date:** [May 7, 2009, 10:57am UTC](https://www.ruby-forum.com/t/calling-winapi-for-enumdisplaymonitors/167294/4 "2009-05-07T10:57:18Z")

</div>

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 P. wrote:

> 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 H.
