Skip to content

Latest commit

 

History

History
140 lines (108 loc) · 4.76 KB

stdWindow.md

File metadata and controls

140 lines (108 loc) · 4.76 KB

stdWindow

Spec

Constructors

CreateFromDesktop() as stdWindow

Creates a stdWindow object from the Desktop. This object is usually used in order to enumerate over all open windows.

Dim window as stdWindow
For each window in stdWindow.CreateFromDesktop.children
    Debug.Print window.name
next

CreateFromHwnd(ByVal hwnd as LongPtr/Long) as stdWindow

Creates a stdWindow object from a supplied hwnd. It is unlikely this function will be needed unless you already have an hwnd from a different library.

Dim window as stdWindow
set window = stdWindow.CreateFromHwnd(Application.Hwnd)

CreateFromPoint(ByVal x as long, ByVal y as Long) as stdWindow

Creates a stdWindow for the window underneath a supplied point.

With MouseGetPos()
  set window = stdWindow.Create(.x, .y)
End With

CreateFromIUnknown(ByVal obj as IUnknown) as stdWindow

Creates a stdWindow object for a supplied IUnknown object which implements either IOleWindow, IInternetSecurityMgrSite or IShellView. Uses shell API's IUnknown_GetWindow function internally. Useful for obtaining the window object of a UserForm object.

Dim uf as UserForm1: set uf = new UserForm1
uf.show false
With stdWindow.CreateFromIUnknown(uf)
  .resizable = true
End With

CreateFromContextMenu() as stdWindow

Creates a stdWindow object which represents the currently open windows context menu (right-click menu).

stdAcc.CreateFromHwnd(stdWindow.CreateFromContextMenu.hwnd).children(1).DoDefaultAction

INSTANCE PROPERTIES

  • Get handle() as LongPtr
  • Get hDC() as LongPtr
  • Get Exists as Boolean
  • Get/Let Visible() as Boolean
  • Get/Let State() as EWndState 'Normal,Minimised,Maximised
  • Get IsFrozen() as Boolean
  • Get/Let Caption() as string
  • Get Class() as string
  • Get RectClient() as Long()
  • Get/Let RectWindow() as Long()
  • Get/Let X() as Long
  • Get/Let Y() as Long
  • Get/Let Width() as Long
  • Get/Let Height() as Long
  • Get ProcessID() as long
  • Get ProcessName() as string
  • Get/Set Parent() as stdWindow
  • Get AncestralRoot() as stdWindow
  • Get/Let Style() as Long
  • Get/Let StyleEx() as Long
  • Get/Let UserData() as LongPtr
  • Get/Let WndProc() as LongPtr
  • Get/Let Resizable() as Boolean
  • Get Children() as Collection
  • Get Descendents() as Collection
  • Get/Let AlwaysOnTop() as Boolean

INSTANCE METHODS

  • SetHook(idHook, hook, hInstance, dwThreadID) as LongPtr
  • Redraw()
  • SendMessage(wMsg, wParam, lParam)
  • PostMessage(wMsg, wParam, lParam)
  • SendMessageTimeout(wMsg, wParam, lParam, TimeoutMilliseconds)
  • ClickInput(x?, y?, Button?)
  • ClickEvent(x?, y?, Button?, isDoubleClick?, wParam?)
  • SendKeysInput(sKeys, bRaw?, keyDelay?)
  • SendKeysEvent(sKeys, bRaw?, keyDelay?)
  • Show()
  • Hide()
  • Maximize()
  • Minimize()
  • Activate()
  • Close()
  • FindFirst(query)
  • FindAll(query)
  • Screenshot()

PROTECTED METHODS

  • protInit(Byval hwnd as Longptr/Long)
  • protGetNextDescendent(stack, DFS, Prev) as stdWindow
  • protGetLookups()

stdVBA Developer docs

Multi-platform

This feature is unimplemented and thus this section will be mostly developer docs

In an ideal world this library would work on all operating systems. The library is definitely possible to implement on all operating systems however currently I mostly lack the time to build and test it on all OSes.

The implementation details of implementing this library on Mac OS X involve use of either ObjC directly (via Obj C runtime C API), or use of a JXA daemon which accesses the System Events application. For example, looping through all windows (via Desktop window) can be done with:

Application("System Events").processes().filter(e=>e.windows().length > 0)

which returns

[
  Application("System Events").applicationProcesses.byName("Terminal"),
  Application("System Events").applicationProcesses.byName("Microsoft Excel"),
  Application("System Events").applicationProcesses.byName("TextEdit"), 
  Application("System Events").applicationProcesses.byName("GitHub Desktop"), 
  Application("System Events").applicationProcesses.byName("Activity Monitor"),
  Application("System Events").applicationProcesses.byName("Google Chrome")
]

There might have to be some abstractions cross platform and some methods may be system specific. however