[Win32utils-devel] Fwd: Win32 - api

Heesob Park phasis at gmail.com
Fri Nov 18 21:54:08 EST 2011


Hi,

2011/11/19 Daniel Berger <djberg96 at gmail.com>

> Forwarding this one to the list.
>
> ---------- Forwarded message ----------
> From: Anton Synytsia <anton.synytsia at yahoo.com>
> Date: Fri, Nov 11, 2011 at 10:14 PM
> Subject: Win32 - api
> To: "djberg96 at gmail.com" <djberg96 at gmail.com>
>
>
> First of all, thanks for win32-api!!! :) I have been using it for a
> quite of time and found a little, but important bug.
> The pointers in callbacks doesn't return the full structure to a pointer:
>
> #######Script#######
> #require 'Sketchup.rb' #if only have sketchup
> require 'win32/api.rb'
> require 'windows/api.rb'
> module HookProc
>  include Windows
>  API.auto_namespace='HookProc'
>  API.auto_constant=true
>  API.new('SetWindowsHookEx', 'IKII', 'I', 'User32')
> #http://msdn.microsoft.com/en-us/library/ms644990(VS.85).aspx
>  API.new('UnhookWindowsHookEx', 'I', 'I', 'User32')
> #http://msdn.microsoft.com/en-us/library/ms644993(v=VS.85).aspx
>  API.new('GetCurrentThreadId', 'V', 'I', 'Kernel32')
> #http://msdn.microsoft.com/en-us/library/ms683183(VS.85).aspx
>  API.new('GetModuleHandle', 'V', 'I', 'Kernel32')
> #http://msdn.microsoft.com/en-us/library/ms683199(v=VS.85).aspx
>  API.new('CallWindowProc', 'PILII', 'I', 'User32')
> #http://msdn.microsoft.com/en-us/library/ms633571(v=VS.85).aspx
>  class LowLevelMouseProc
>   def initialize(&block)
>    @hhk=0
>    @mouse_procLL=Win32::API::Callback.new("ILP", 'I'){|nCode, wParam,
> lParam| #http://msdn.microsoft.com/en-us/library/ms644986(v=VS.85).aspx
>  @onLowLevelMouseInput.call(nCode, wParam, lParam)
>    }
>    @onLowLevelMouseInput=block
>   end
>   def onLowLevelMouseInput(&block)
>    @onLowLevelMouseInput=block
>    0 #Return Value: 0 - process the message, 1 or other digit - remove
> the mouse message from the module handle, WARNING will act like mouse
> off
>   end
>   def hook()
>    @hhk=HookProc::SetWindowsHookEx.call(14, @mouse_procLL,
> GetModuleHandle.call, 0)
>   end
>   def unhook()
>    HookProc::UnhookWindowsHookEx.call(@hhk)
>   end
>  end #LowLevelMouseProc
> end #HookProc
> myLowLevelMouseProc=HookProc::LowLevelMouseProc.new{|nCode, wParam, lParam|
>  print("\nnCode: #{nCode}, wParam: #{wParam}, lParam: #{lParam.inspect}")
>  0 #Return Value: 0 - process the message, 1 or other digit - remove
> the mouse message from the module handle - WARNING will act like mouse
> off
> }
> #myLowLevelMouseProc.hook
> #myLowLevelMouseProc.unhook
> =begin Only Use that if have Sketchup and erase the above 2 filled lines
> unless file_loaded?(__FILE__)
>  state=false
>  submenu=UI.menu("Plugins").add_submenu("HookProc")
>  item=submenu.add_item("LowLevelMouseProc"){
>   if state
>    myLowLevelMouseProc.unhook
>    state=false
>   else
>    myLowLevelMouseProc.hook
>    state=true
>   end
>  }
>  submenu.set_validation_proc(item){if state then MF_CHECKED else
> MF_UNCHECKED end}
>  file_loaded(__FILE__)
> end
> =end
> #######Script#######
>
> As stated in above script, lParam should return the pointer to
> MSLLHOOKSTRUCT(link:
> http://msdn.microsoft.com/en-us/library/ms644970(v=VS.85).aspx)
> structure. Instead for the result lParam only is filled with some
> parts of MSLLHOOKSTRUCT. The parts are x coordinate and sometimes y
> coordinate. To check I have test it on Borland Delphi 6 and  it
> returned the whole pointer, but on ruby win32-api  it doesn't. I don't
> know the bug that makes it and so reported it to u to please fix and
> update it. I would help on anything I could, Thanks.
>
> Here is some thing I think:
>
> "If some part of the string is nil, then the pointer is assumed to be
> nil at the rest of the script, so that's why it only shows-up only
> part of pointer."
>
>
On the above code, I cannot see how you retrieve each element
of MSLLHOOKSTRUCT in the lParam pointer.
If you think nil is the cause, I guess you used strcpy instead of memcpy.

You can use memcpy like this:

require "windows/msvcrt/buffer"
include Windows::MSVCRT::Buffer

size_of_MSLLHOOKSTRUCT = 28
stMSLLHOOK = 0.chr * size_of_MSLLHOOKSTRUCT
memcpy(stMSLLHOOK,lParam,size_of_MSLLHOOKSTRUCT)
x,y,mouseData,flags,time,dwExtraInfo = stMSLLHOOK.unpack("LLLLLL")


Regards,
Park Heesob
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://rubyforge.org/pipermail/win32utils-devel/attachments/20111119/06123ccf/attachment.html>


More information about the win32utils-devel mailing list