Skip to content

Instantly share code, notes, and snippets.

@snscaimito
Created January 12, 2011 21:46
Show Gist options
  • Save snscaimito/776964 to your computer and use it in GitHub Desktop.
Save snscaimito/776964 to your computer and use it in GitHub Desktop.
GUID
class GUID < FFI::Struct
layout :data1, :int32,
:data2, :int16,
:data3, :int16,
:data4_0, :int8,
:data4_1, :int8,
:data4_2, :int8,
:data4_3, :int8,
:data4_4, :int8,
:data4_5, :int8,
:data4_6, :int8,
:data4_7, :int8,
end
class IAccessible < FFI::Struct
layout :lpVtbl, :pointer
end
class IAccessibleVtbl < FFI::Struct
layout :QueryInterface, :pointer,
:AddRef, :pointer,
:Release, :pointer,
:GetTypeInfoCount, :pointer,
:GetTypeInfo, :pointer,
:GetIDsOfNames, :pointer,
:Invoke, :pointer,
:get_accParent, :pointer,
:get_accChildCount, :pointer,
:get_accChild, :pointer,
:get_accName, :pointer,
:get_accValue, :pointer,
:get_accDescription, :pointer,
:get_accRole, :pointer,
:get_accState, :pointer,
:get_accHelp, :pointer,
:get_accHelpTopic, :pointer,
:get_accKeyboardShortcut, :pointer,
:get_accFocus, :pointer,
:get_accSelection, :pointer,
:get_accDefaultAction, :pointer,
:accSelect, :pointer,
:accLocation, :pointer,
:accNavigate, :pointer,
:accHitTest, :pointer,
:accDoDefaultAction, :pointer,
:put_accName, :pointer,
:put_accValue, :pointer
end
class Variant < FFI::Struct
layout :vt, :long,
:wReserved1, :uint,
:wReserved2, :uint,
:wReserved3, :uint,
:lVal, :long
end
S_OK = 0
E_INVALIDARG = 0x80070057
E_NOINTERFACE = 0x80004002
def state_of_accessible_button(hwnd)
co_initialize nil
module_handle = load_library "oleacc.dll"
if (module_handle != 0)
address_accessible_object_from_window = get_proc_address(module_handle, "AccessibleObjectFromWindow")
guid = GUID.new
guid[:data1] = 0x618736e0
guid[:data2] = 0x3c3d
guid[:data3] = 0x11cf
guid[:data4_0] = 0x81
guid[:data4_1] = 0x0c
guid[:data4_2] = 0x00
guid[:data4_3] = 0xaa
guid[:data4_4] = 0x00
guid[:data4_5] = 0x38
guid[:data4_6] = 0x9b
guid[:data4_7] = 0x71
i_accessible_ptr = FFI::MemoryPointer.new(:pointer)
accessible_object_from_window = FFI::Function.new(:uint32, [:long, :uint32, :pointer, :pointer ], address_accessible_object_from_window)
hResult = accessible_object_from_window.call(hwnd, 0xFFFFFFFC, guid, i_accessible_ptr) # for OBJID_CLIENT
if (hResult == S_OK)
i_accessible = IAccessible.new(i_accessible_ptr.read_pointer)
i_accessible_vtbl = IAccessibleVtbl.new(i_accessible[:lpVtbl])
get_accState = FFI::Function.new(:uint32, [:pointer, :pointer, :pointer], i_accessible_vtbl[:get_accState])
variant_in = Variant.new
variant_in[:vt] = 3
variant_in[:lVal] = 0 # CHILDID_SELF
variant_out = Variant.new
result = get_accState.call(i_accessible, variant_in, variant_out) # segfault
puts "result" + result.to_s
puts "variant_out" + variant_out[:lVal]
end
if (hResult == E_INVALIDARG)
puts "E_INVALIDARG"
end
if (hResult == E_NOINTERFACE)
puts "E_NOINTERFACE"
end
puts "hResult = 0x" + hResult.to_s(16)
end
co_uninitialize
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment