JwaWinAble.pas
上传用户:davidchvip
上传日期:2009-07-28
资源大小:1749k
文件大小:26k
源码类别:

Windows编程

开发平台:

Delphi

  1. {******************************************************************************}
  2. {                                                                       }
  3. { Hooking mechanism to receive system events interface Unit for Object Pascal  }
  4. {                                                                       }
  5. { Portions created by Microsoft are Copyright (C) 1995-2001 Microsoft          }
  6. { Corporation. All Rights Reserved.                                            }
  7. {                 }
  8. { The original file is: winable.h, released June 2000. The original Pascal     }
  9. { code is: WinAble.pas, released December 2000. The initial developer of the   }
  10. { Pascal code is Marcel van Brakel (brakelm@chello.nl).                        }
  11. {                                                                              }
  12. { Portions created by Marcel van Brakel are Copyright (C) 1999-2001            }
  13. { Marcel van Brakel. All Rights Reserved.                                      }
  14. {                 }
  15. { Obtained through: Joint Endeavour of Delphi Innovators (Project JEDI)        }
  16. {                }
  17. { You may retrieve the latest version of this file at the Project JEDI home    }
  18. { page, located at http://delphi-jedi.org or my personal homepage located at   }
  19. { http://members.chello.nl/m.vanbrakel2                                        }
  20. {                }
  21. { The contents of this file are used with permission, subject to the Mozilla   }
  22. { Public License Version 1.1 (the "License"); you may not use this file except }
  23. { in compliance with the License. You may obtain a copy of the License at      }
  24. { http://www.mozilla.org/MPL/MPL-1.1.html                                      }
  25. {                                                                              }
  26. { Software distributed under the License is distributed on an "AS IS" basis,   }
  27. { WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for }
  28. { the specific language governing rights and limitations under the License.    }
  29. {                                                                              }
  30. { Alternatively, the contents of this file may be used under the terms of the  }
  31. { GNU Lesser General Public License (the  "LGPL License"), in which case the   }
  32. { provisions of the LGPL License are applicable instead of those above.        }
  33. { If you wish to allow use of your version of this file only under the terms   }
  34. { of the LGPL License and not to allow others to use your version of this file }
  35. { under the MPL, indicate your decision by deleting  the provisions above and  }
  36. { replace  them with the notice and other provisions required by the LGPL      }
  37. { License.  If you do not delete the provisions above, a recipient may use     }
  38. { your version of this file under either the MPL or the LGPL License.          }
  39. {                 }
  40. { For more information about the LGPL: http://www.gnu.org/copyleft/lesser.html }
  41. {                 }
  42. {******************************************************************************}
  43. unit JwaWinAble;
  44. {$WEAKPACKAGEUNIT}
  45. {$HPPEMIT ''}
  46. {$HPPEMIT '#include "WinAble.h"'}
  47. {$HPPEMIT ''}
  48. {$I WINDEFINES.INC}
  49. interface
  50. uses
  51.   JwaWinType;
  52. //
  53. // This gets GUI information out of context.  If you pass in a NULL thread ID,
  54. // we will get the 'global' information, using the foreground thread.  This
  55. // is guaranteed to be the real active window, focus window, etc.  Yes, you
  56. // could do it yourself by calling GetForegorundWindow, getting the thread ID
  57. // of that window via GetWindowThreadProcessId, then passing the ID into
  58. // GetGUIThreadInfo().  However, that takes three calls and aside from being
  59. // a pain, anything could happen in the middle.  So passing in NULL gets
  60. // you stuff in one call and hence also works right.
  61. //
  62. type
  63.   LPGUITHREADINFO = ^GUITHREADINFO;
  64.   {$EXTERNALSYM LPGUITHREADINFO}
  65.   tagGUITHREADINFO = record
  66.     cbSize: DWORD;
  67.     flags: DWORD;
  68.     hwndActive: HWND;
  69.     hwndFocus: HWND;
  70.     hwndCapture: HWND;
  71.     hwndMenuOwner: HWND;
  72.     hwndMoveSize: HWND;
  73.     hwndCaret: HWND;
  74.     rcCaret: RECT;
  75.   end;
  76.   {$EXTERNALSYM tagGUITHREADINFO}
  77.   GUITHREADINFO = tagGUITHREADINFO;
  78.   {$EXTERNALSYM GUITHREADINFO}
  79.   TGuiThreadInfo = GUITHREADINFO;
  80.   PGuiThreadInfo = LPGUITHREADINFO;
  81. const
  82.   GUI_CARETBLINKING  = $00000001;
  83.   {$EXTERNALSYM GUI_CARETBLINKING}
  84.   GUI_INMOVESIZE     = $00000002;
  85.   {$EXTERNALSYM GUI_INMOVESIZE}
  86.   GUI_INMENUMODE     = $00000004;
  87.   {$EXTERNALSYM GUI_INMENUMODE}
  88.   GUI_SYSTEMMENUMODE = $00000008;
  89.   {$EXTERNALSYM GUI_SYSTEMMENUMODE}
  90.   GUI_POPUPMENUMODE  = $00000010;
  91.   {$EXTERNALSYM GUI_POPUPMENUMODE}
  92. function GetGUIThreadInfo(idThread: DWORD; var lpgui: GUITHREADINFO): BOOL; stdcall;
  93. {$EXTERNALSYM GetGUIThreadInfo}
  94. function GetWindowModuleFileNameW(hwnd: HWND; lpFileName: LPWSTR; cchFileName: UINT): UINT; stdcall;
  95. {$EXTERNALSYM GetWindowModuleFileNameW}
  96. function GetWindowModuleFileNameA(hwnd: HWND; lpFileName: LPSTR; cchFileName: UINT): UINT; stdcall;
  97. {$EXTERNALSYM GetWindowModuleFileNameA}
  98. {$IFDEF UNICODE}
  99. function GetWindowModuleFileName(hwnd: HWND; lpFileName: LPWSTR; cchFileName: UINT): UINT; stdcall;
  100. {$EXTERNALSYM GetWindowModuleFileName}
  101. {$ELSE}
  102. function GetWindowModuleFileName(hwnd: HWND; lpFileName: LPSTR; cchFileName: UINT): UINT; stdcall;
  103. {$EXTERNALSYM GetWindowModuleFileName}
  104. {$ENDIF}
  105. //
  106. // This returns FALSE if the caller doesn't have permissions to do this
  107. // esp. if someone else is dorking with input.  I.E., if some other thread
  108. // disabled input, and thread 2 tries to diable/enable it, the call will
  109. // fail since thread 1 has the cookie.
  110. //
  111. function BlockInput(fBlockIt: BOOL): BOOL; stdcall;
  112. {$EXTERNALSYM BlockInput}
  113. //
  114. // Note that the dwFlags field uses the same flags as keybd_event and
  115. // mouse_event, depending on what type of input this is.
  116. //
  117. type
  118.   LPMOUSEINPUT = ^MOUSEINPUT;
  119.   {$EXTERNALSYM LPMOUSEINPUT}
  120.   PMOUSEINPUT = ^MOUSEINPUT;
  121.   {$EXTERNALSYM PMOUSEINPUT}
  122.   tagMOUSEINPUT = record
  123.     dx: LONG;
  124.     dy: LONG;
  125.     mouseData: DWORD;
  126.     dwFlags: DWORD;
  127.     time: DWORD;
  128.     dwExtraInfo: DWORD;
  129.   end;
  130.   {$EXTERNALSYM tagMOUSEINPUT}
  131.   MOUSEINPUT = tagMOUSEINPUT;
  132.   {$EXTERNALSYM MOUSEINPUT}
  133.   TMouseInput = MOUSEINPUT;
  134.   LPKEYBDINPUT = ^KEYBDINPUT;
  135.   {$EXTERNALSYM LPKEYBDINPUT}
  136.   PKEYBDINPUT = ^KEYBDINPUT;
  137.   {$EXTERNALSYM PKEYBDINPUT}
  138.   tagKEYBDINPUT = record
  139.     wVk: WORD;
  140.     wScan: WORD;
  141.     dwFlags: DWORD;
  142.     time: DWORD;
  143.     dwExtraInfo: DWORD;
  144.   end;
  145.   {$EXTERNALSYM tagKEYBDINPUT}
  146.   KEYBDINPUT = tagKEYBDINPUT;
  147.   {$EXTERNALSYM KEYBDINPUT}
  148.   TKeybdInput = KEYBDINPUT;
  149.   LPHARDWAREINPUT = ^HARDWAREINPUT;
  150.   {$EXTERNALSYM LPHARDWAREINPUT}
  151.   PHARDWAREINPUT = ^HARDWAREINPUT;
  152.   {$EXTERNALSYM PHARDWAREINPUT}
  153.   tagHARDWAREINPUT = record
  154.     uMsg: DWORD;
  155.     wParamL: WORD;
  156.     wParamH: WORD;
  157.     dwExtraInfo: DWORD;
  158.   end;
  159.   {$EXTERNALSYM tagHARDWAREINPUT}
  160.   HARDWAREINPUT = tagHARDWAREINPUT;
  161.   {$EXTERNALSYM HARDWAREINPUT}
  162.   THardwareInput = HARDWAREINPUT;
  163. const
  164.   INPUT_MOUSE    = 0;
  165.   {$EXTERNALSYM INPUT_MOUSE}
  166.   INPUT_KEYBOARD = 1;
  167.   {$EXTERNALSYM INPUT_KEYBOARD}
  168.   INPUT_HARDWARE = 2;
  169.   {$EXTERNALSYM INPUT_HARDWARE}
  170. type
  171.   LPINPUT = ^INPUT;
  172.   {$EXTERNALSYM LPINPUT}
  173.   PINPUT = ^INPUT;
  174.   {$EXTERNALSYM PINPUT}
  175.   tagINPUT = record
  176.     type_: DWORD;
  177.     case Integer of
  178.       0: (mi: MOUSEINPUT);
  179.       1: (ki: KEYBDINPUT);
  180.       2: (hi: HARDWAREINPUT);
  181.   end;
  182.   {$EXTERNALSYM tagINPUT}
  183.   INPUT = tagINPUT;
  184.   {$EXTERNALSYM INPUT}
  185.   TInput = INPUT;
  186. //
  187. // This returns the number of inputs played back.  It will disable input
  188. // first, play back as many as possible, then reenable input.  In the middle
  189. // it will pulse the RIT to make sure that the fixed input queue doesn't
  190. // fill up.
  191. //
  192. function SendInput(cInputs: UINT; pInputs: LPINPUT; cbSize: Integer): UINT; stdcall;
  193. {$EXTERNALSYM SendInput}
  194. const
  195.   CCHILDREN_FRAME = 7;
  196.   {$EXTERNALSYM CCHILDREN_FRAME}
  197. //
  198. // This generates a notification that anyone watching for it will get.
  199. // This call is superfast if nobody is hooking anything.
  200. //
  201. procedure NotifyWinEvent(event: DWORD; hwnd: HWND; idObject, idChild: LONG); stdcall;
  202. {$EXTERNALSYM NotifyWinEvent}
  203. //
  204. // hwnd + idObject can be used with OLEACC.DLL's OleGetObjectFromWindow()
  205. // to get an interface pointer to the container.  indexChild is the item
  206. // within the container in question.  Setup a VARIANT with vt VT_I4 and 
  207. // lVal the indexChild and pass that in to all methods.  Then you 
  208. // are raring to go.
  209. //
  210. //
  211. // Common object IDs (cookies, only for sending WM_GETOBJECT to get at the
  212. // thing in question).  Positive IDs are reserved for apps (app specific),
  213. // negative IDs are system things and are global, 0 means "just little old
  214. // me".
  215. //
  216. const
  217.   CHILDID_SELF = 0;
  218.   {$EXTERNALSYM CHILDID_SELF}
  219. // Reserved IDs for system objects
  220.   OBJID_WINDOW   = DWORD($00000000);
  221.   {$EXTERNALSYM OBJID_WINDOW}
  222.   OBJID_SYSMENU  = DWORD($FFFFFFFF);
  223.   {$EXTERNALSYM OBJID_SYSMENU}
  224.   OBJID_TITLEBAR = DWORD($FFFFFFFE);
  225.   {$EXTERNALSYM OBJID_TITLEBAR}
  226.   OBJID_MENU     = DWORD($FFFFFFFD);
  227.   {$EXTERNALSYM OBJID_MENU}
  228.   OBJID_CLIENT   = DWORD($FFFFFFFC);
  229.   {$EXTERNALSYM OBJID_CLIENT}
  230.   OBJID_VSCROLL  = DWORD($FFFFFFFB);
  231.   {$EXTERNALSYM OBJID_VSCROLL}
  232.   OBJID_HSCROLL  = DWORD($FFFFFFFA);
  233.   {$EXTERNALSYM OBJID_HSCROLL}
  234.   OBJID_SIZEGRIP = DWORD($FFFFFFF9);
  235.   {$EXTERNALSYM OBJID_SIZEGRIP}
  236.   OBJID_CARET    = DWORD($FFFFFFF8);
  237.   {$EXTERNALSYM OBJID_CARET}
  238.   OBJID_CURSOR   = DWORD($FFFFFFF7);
  239.   {$EXTERNALSYM OBJID_CURSOR}
  240.   OBJID_ALERT    = DWORD($FFFFFFF6);
  241.   {$EXTERNALSYM OBJID_ALERT}
  242.   OBJID_SOUND    = DWORD($FFFFFFF5);
  243.   {$EXTERNALSYM OBJID_SOUND}
  244. //
  245. // System Alerts (indexChild of system ALERT notification)
  246. //
  247.   ALERT_SYSTEM_INFORMATIONAL = 1; // MB_INFORMATION
  248.   {$EXTERNALSYM ALERT_SYSTEM_INFORMATIONAL}
  249.   ALERT_SYSTEM_WARNING       = 2; // MB_WARNING
  250.   {$EXTERNALSYM ALERT_SYSTEM_WARNING}
  251.   ALERT_SYSTEM_ERROR         = 3; // MB_ERROR
  252.   {$EXTERNALSYM ALERT_SYSTEM_ERROR}
  253.   ALERT_SYSTEM_QUERY         = 4; // MB_QUESTION
  254.   {$EXTERNALSYM ALERT_SYSTEM_QUERY}
  255.   ALERT_SYSTEM_CRITICAL      = 5; // HardSysErrBox
  256.   {$EXTERNALSYM ALERT_SYSTEM_CRITICAL}
  257.   CALERT_SYSTEM              = 6;
  258.   {$EXTERNALSYM CALERT_SYSTEM}
  259. type
  260.   HWINEVENTHOOK = DWORD;
  261.   {$EXTERNALSYM HWINEVENTHOOK}
  262.   WINEVENTPROC = procedure (
  263.     hEvent: HWINEVENTHOOK;
  264.     event: DWORD;
  265.     hwnd: HWND;
  266.     idObject: LONG;
  267.     idChild: LONG;
  268.     idEventThread: DWORD;
  269.     dwmsEventTime: DWORD); stdcall;
  270.   {$EXTERNALSYM WINEVENTPROC}
  271.   TWinEventProc = WINEVENTPROC;
  272. const
  273.   WINEVENT_OUTOFCONTEXT   = $0000; // Events are ASYNC
  274.   {$EXTERNALSYM WINEVENT_OUTOFCONTEXT}
  275.   WINEVENT_SKIPOWNTHREAD  = $0001; // Don't call back for events on installer's thread
  276.   {$EXTERNALSYM WINEVENT_SKIPOWNTHREAD}
  277.   WINEVENT_SKIPOWNPROCESS = $0002; // Don't call back for events on installer's process
  278.   {$EXTERNALSYM WINEVENT_SKIPOWNPROCESS}
  279.   WINEVENT_INCONTEXT      = $0004; // Events are SYNC, this causes your dll to be injected into every process
  280.   {$EXTERNALSYM WINEVENT_INCONTEXT}
  281.   WINEVENT_32BITCALLER    = $8000; // ;Internal
  282.   {$EXTERNALSYM WINEVENT_32BITCALLER}
  283.   WINEVENT_VALID          = $8007; // ;Internal
  284.   {$EXTERNALSYM WINEVENT_VALID}
  285. function SetWinEventHook(eventMin, eventMax: DWORD; hmodWinEventProc: HMODULE;
  286.   lpfnWinEventProc: WINEVENTPROC; idProcess, idThread, dwFlags: DWORD): HWINEVENTHOOK; stdcall;
  287. {$EXTERNALSYM SetWinEventHook}
  288. //
  289. // Returns zero on failure, or a DWORD ID if success.  We will clean up any
  290. // event hooks installed by the current process when it goes away, if it
  291. // hasn't cleaned the hooks up itself.  But to dynamically unhook, call
  292. // UnhookWinEvents().
  293. //
  294. function UnhookWinEvent(hEvent: HWINEVENTHOOK): BOOL; stdcall;
  295. {$EXTERNALSYM UnhookWinEvent}
  296. //
  297. // If idProcess isn't zero but idThread is, will hook all threads in that
  298. //      process.
  299. // If idThread isn't zero but idProcess is, will hook idThread only.
  300. // If both are zero, will hook everything
  301. //
  302. //
  303. // EVENT DEFINITION
  304. //
  305. const
  306.   EVENT_MIN = $00000001;
  307.   {$EXTERNALSYM EVENT_MIN}
  308.   EVENT_MAX = $7FFFFFFF;
  309.   {$EXTERNALSYM EVENT_MAX}
  310. //
  311. //  EVENT_SYSTEM_SOUND
  312. //  Sent when a sound is played.  Currently nothing is generating this, we
  313. //  are going to be cleaning up the SOUNDSENTRY feature in the control panel
  314. //  and will use this at that time.  Applications implementing WinEvents
  315. //  are perfectly welcome to use it.  Clients of IAccessible* will simply
  316. //  turn around and get back a non-visual object that describes the sound.
  317. //
  318.   EVENT_SYSTEM_SOUND = $0001;
  319.   {$EXTERNALSYM EVENT_SYSTEM_SOUND}
  320. //
  321. // EVENT_SYSTEM_ALERT
  322. // Sent when an alert needs to be given to the user.  MessageBoxes generate
  323. // alerts for example.
  324. //
  325.   EVENT_SYSTEM_ALERT = $0002;
  326.   {$EXTERNALSYM EVENT_SYSTEM_ALERT}
  327. //
  328. // EVENT_SYSTEM_FOREGROUND
  329. // Sent when the foreground (active) window changes, even if it is changing
  330. // to another window in the same thread as the previous one.
  331. //
  332.   EVENT_SYSTEM_FOREGROUND = $0003;
  333.   {$EXTERNALSYM EVENT_SYSTEM_FOREGROUND}
  334. //
  335. // EVENT_SYSTEM_MENUSTART
  336. // EVENT_SYSTEM_MENUEND
  337. // Sent when entering into and leaving from menu mode (system, app bar, and
  338. // track popups).
  339. //
  340.   EVENT_SYSTEM_MENUSTART = $0004;
  341.   {$EXTERNALSYM EVENT_SYSTEM_MENUSTART}
  342.   EVENT_SYSTEM_MENUEND   = $0005;
  343.   {$EXTERNALSYM EVENT_SYSTEM_MENUEND}
  344. //
  345. // EVENT_SYSTEM_MENUPOPUPSTART
  346. // EVENT_SYSTEM_MENUPOPUPEND
  347. // Sent when a menu popup comes up and just before it is taken down.  Note
  348. // that for a call to TrackPopupMenu(), a client will see EVENT_SYSTEM_MENUSTART
  349. // followed almost immediately by EVENT_SYSTEM_MENUPOPUPSTART for the popup
  350. // being shown.
  351. //
  352.   EVENT_SYSTEM_MENUPOPUPSTART = $0006;
  353.   {$EXTERNALSYM EVENT_SYSTEM_MENUPOPUPSTART}
  354.   EVENT_SYSTEM_MENUPOPUPEND   = $0007;
  355.   {$EXTERNALSYM EVENT_SYSTEM_MENUPOPUPEND}
  356. //
  357. // EVENT_SYSTEM_CAPTURESTART
  358. // EVENT_SYSTEM_CAPTUREEND
  359. // Sent when a window takes the capture and releases the capture.
  360. //
  361.   EVENT_SYSTEM_CAPTURESTART = $0008;
  362.   {$EXTERNALSYM EVENT_SYSTEM_CAPTURESTART}
  363.   EVENT_SYSTEM_CAPTUREEND   = $0009;
  364.   {$EXTERNALSYM EVENT_SYSTEM_CAPTUREEND}
  365. //
  366. // EVENT_SYSTEM_MOVESIZESTART
  367. // EVENT_SYSTEM_MOVESIZEEND
  368. // Sent when a window enters and leaves move-size dragging mode.
  369. //
  370.   EVENT_SYSTEM_MOVESIZESTART = $000A;
  371.   {$EXTERNALSYM EVENT_SYSTEM_MOVESIZESTART}
  372.   EVENT_SYSTEM_MOVESIZEEND   = $000B;
  373.   {$EXTERNALSYM EVENT_SYSTEM_MOVESIZEEND}
  374. //
  375. // EVENT_SYSTEM_CONTEXTHELPSTART
  376. // EVENT_SYSTEM_CONTEXTHELPEND
  377. // Sent when a window enters and leaves context sensitive help mode.
  378. //
  379.   EVENT_SYSTEM_CONTEXTHELPSTART = $000C;
  380.   {$EXTERNALSYM EVENT_SYSTEM_CONTEXTHELPSTART}
  381.   EVENT_SYSTEM_CONTEXTHELPEND   = $000D;
  382.   {$EXTERNALSYM EVENT_SYSTEM_CONTEXTHELPEND}
  383. //
  384. // EVENT_SYSTEM_DRAGDROPSTART
  385. // EVENT_SYSTEM_DRAGDROPEND
  386. // Sent when a window enters and leaves drag drop mode.  Note that it is up
  387. // to apps and OLE to generate this, since the system doesn't know.  Like
  388. // EVENT_SYSTEM_SOUND, it will be a while before this is prevalent.
  389. //
  390.   EVENT_SYSTEM_DRAGDROPSTART = $000E;
  391.   {$EXTERNALSYM EVENT_SYSTEM_DRAGDROPSTART}
  392.   EVENT_SYSTEM_DRAGDROPEND   = $000F;
  393.   {$EXTERNALSYM EVENT_SYSTEM_DRAGDROPEND}
  394. //
  395. // EVENT_SYSTEM_DIALOGSTART
  396. // EVENT_SYSTEM_DIALOGEND
  397. // Sent when a dialog comes up and just before it goes away.
  398. //
  399.   EVENT_SYSTEM_DIALOGSTART = $0010;
  400.   {$EXTERNALSYM EVENT_SYSTEM_DIALOGSTART}
  401.   EVENT_SYSTEM_DIALOGEND   = $0011;
  402.   {$EXTERNALSYM EVENT_SYSTEM_DIALOGEND}
  403. //
  404. // EVENT_SYSTEM_SCROLLINGSTART
  405. // EVENT_SYSTEM_SCROLLINGEND
  406. // Sent when beginning and ending the tracking of a scrollbar in a window,
  407. // and also for scrollbar controls.
  408. //
  409.   EVENT_SYSTEM_SCROLLINGSTART = $0012;
  410.   {$EXTERNALSYM EVENT_SYSTEM_SCROLLINGSTART}
  411.   EVENT_SYSTEM_SCROLLINGEND   = $0013;
  412.   {$EXTERNALSYM EVENT_SYSTEM_SCROLLINGEND}
  413. //
  414. // EVENT_SYSTEM_SWITCHSTART
  415. // EVENT_SYSTEM_SWITCHEND
  416. // Sent when beginning and ending alt-tab mode with the switch window.
  417. //
  418.   EVENT_SYSTEM_SWITCHSTART = $0014;
  419.   {$EXTERNALSYM EVENT_SYSTEM_SWITCHSTART}
  420.   EVENT_SYSTEM_SWITCHEND   = $0015;
  421.   {$EXTERNALSYM EVENT_SYSTEM_SWITCHEND}
  422. //
  423. // EVENT_SYSTEM_MINIMIZESTART
  424. // EVENT_SYSTEM_MINIMIZEEND
  425. // Sent when a window minimizes and just before it restores.
  426. //
  427.   EVENT_SYSTEM_MINIMIZESTART = $0016;
  428.   {$EXTERNALSYM EVENT_SYSTEM_MINIMIZESTART}
  429.   EVENT_SYSTEM_MINIMIZEEND   = $0017;
  430.   {$EXTERNALSYM EVENT_SYSTEM_MINIMIZEEND}
  431. //
  432. // Object events
  433. //
  434. // The system AND apps generate these.  The system generates these for 
  435. // real windows.  Apps generate these for objects within their window which
  436. // act like a separate control, e.g. an item in a list view.
  437. //
  438. // For all events, if you want detailed accessibility information, callers
  439. // should
  440. //      * Call AccessibleObjectFromWindow() with the hwnd, idObject parameters
  441. //          of the event, and IID_IAccessible as the REFIID, to get back an 
  442. //          IAccessible* to talk to
  443. //      * Initialize and fill in a VARIANT as VT_I4 with lVal the idChild
  444. //          parameter of the event.
  445. //      * If idChild isn't zero, call get_accChild() in the container to see
  446. //          if the child is an object in its own right.  If so, you will get
  447. //          back an IDispatch* object for the child.  You should release the
  448. //          parent, and call QueryInterface() on the child object to get its
  449. //          IAccessible*.  Then you talk directly to the child.  Otherwise,
  450. //          if get_accChild() returns you nothing, you should continue to
  451. //          use the child VARIANT.  You will ask the container for the properties
  452. //          of the child identified by the VARIANT.  In other words, the
  453. //          child in this case is accessible but not a full-blown object.
  454. //          Like a button on a titlebar which is 'small' and has no children.
  455. //          
  456. //
  457.   EVENT_OBJECT_CREATE  = $8000; // hwnd + ID + idChild is created item
  458.   {$EXTERNALSYM EVENT_OBJECT_CREATE}
  459.   EVENT_OBJECT_DESTROY = $8001; // hwnd + ID + idChild is destroyed item
  460.   {$EXTERNALSYM EVENT_OBJECT_DESTROY}
  461.   EVENT_OBJECT_SHOW    = $8002; // hwnd + ID + idChild is shown item
  462.   {$EXTERNALSYM EVENT_OBJECT_SHOW}
  463.   EVENT_OBJECT_HIDE    = $8003; // hwnd + ID + idChild is hidden item
  464.   {$EXTERNALSYM EVENT_OBJECT_HIDE}
  465.   EVENT_OBJECT_REORDER = $8004; // hwnd + ID + idChild is parent of zordering children
  466.   {$EXTERNALSYM EVENT_OBJECT_REORDER}
  467. //
  468. // NOTE:
  469. // Minimize the number of notifications!  
  470. //
  471. // When you are hiding a parent object, obviously all child objects are no 
  472. // longer visible on screen.  They still have the same "visible" status, 
  473. // but are not truly visible.  Hence do not send HIDE notifications for the
  474. // children also.  One implies all.  The same goes for SHOW.
  475. //
  476.   EVENT_OBJECT_FOCUS           = $8005; // hwnd + ID + idChild is focused item
  477.   {$EXTERNALSYM EVENT_OBJECT_FOCUS}
  478.   EVENT_OBJECT_SELECTION       = $8006; // hwnd + ID + idChild is selected item (if only one), or idChild is OBJID_WINDOW if complex
  479.   {$EXTERNALSYM EVENT_OBJECT_SELECTION}
  480.   EVENT_OBJECT_SELECTIONADD    = $8007; // hwnd + ID + idChild is item added
  481.   {$EXTERNALSYM EVENT_OBJECT_SELECTIONADD}
  482.   EVENT_OBJECT_SELECTIONREMOVE = $8008; // hwnd + ID + idChild is item removed
  483.   {$EXTERNALSYM EVENT_OBJECT_SELECTIONREMOVE}
  484.   EVENT_OBJECT_SELECTIONWITHIN = $8009; // hwnd + ID + idChild is parent of changed selected items
  485.   {$EXTERNALSYM EVENT_OBJECT_SELECTIONWITHIN}
  486. //
  487. // NOTES:
  488. // There is only one "focused" child item in a parent.  This is the place
  489. // keystrokes are going at a given moment.  Hence only send a notification 
  490. // about where the NEW focus is going.  A NEW item getting the focus already 
  491. // implies that the OLD item is losing it.
  492. //
  493. // SELECTION however can be multiple.  Hence the different SELECTION
  494. // notifications.  Here's when to use each:
  495. //
  496. // (1) Send a SELECTION notification in the simple single selection
  497. //     case (like the focus) when the item with the selection is
  498. //     merely moving to a different item within a container.  hwnd + ID
  499. //     is the container control, idChildItem is the new child with the
  500. //     selection.
  501. //
  502. // (2) Send a SELECTIONADD notification when a new item has simply been added 
  503. //     to the selection within a container.  This is appropriate when the
  504. //     number of newly selected items is very small.  hwnd + ID is the
  505. //     container control, idChildItem is the new child added to the selection.
  506. //
  507. // (3) Send a SELECTIONREMOVE notification when a new item has simply been
  508. //     removed from the selection within a container.  This is appropriate
  509. //     when the number of newly selected items is very small, just like
  510. //     SELECTIONADD.  hwnd + ID is the container control, idChildItem is the
  511. //     new child removed from the selection.
  512. //
  513. // (4) Send a SELECTIONWITHIN notification when the selected items within a
  514. //     control have changed substantially.  Rather than propagate a large
  515. //     number of changes to reflect removal for some items, addition of
  516. //     others, just tell somebody who cares that a lot happened.  It will
  517. //     be faster an easier for somebody watching to just turn around and
  518. //     query the container control what the new bunch of selected items
  519. //     are.
  520. //
  521.   EVENT_OBJECT_STATECHANGE    = $800A; // hwnd + ID + idChild is item w/ state change
  522.   {$EXTERNALSYM EVENT_OBJECT_STATECHANGE}
  523.   EVENT_OBJECT_LOCATIONCHANGE = $800B; // hwnd + ID + idChild is moved/sized item
  524.   {$EXTERNALSYM EVENT_OBJECT_LOCATIONCHANGE}
  525.   EVENT_OBJECT_NAMECHANGE        = $800C; // hwnd + ID + idChild is item w/ name change
  526.   {$EXTERNALSYM EVENT_OBJECT_NAMECHANGE}
  527.   EVENT_OBJECT_DESCRIPTIONCHANGE = $800D; // hwnd + ID + idChild is item w/ desc change
  528.   {$EXTERNALSYM EVENT_OBJECT_DESCRIPTIONCHANGE}
  529.   EVENT_OBJECT_VALUECHANGE       = $800E; // hwnd + ID + idChild is item w/ value change
  530.   {$EXTERNALSYM EVENT_OBJECT_VALUECHANGE}
  531.   EVENT_OBJECT_PARENTCHANGE      = $800F; // hwnd + ID + idChild is item w/ new parent
  532.   {$EXTERNALSYM EVENT_OBJECT_PARENTCHANGE}
  533.   EVENT_OBJECT_HELPCHANGE        = $8010; // hwnd + ID + idChild is item w/ help change
  534.   {$EXTERNALSYM EVENT_OBJECT_HELPCHANGE}
  535.   EVENT_OBJECT_DEFACTIONCHANGE   = $8011; // hwnd + ID + idChild is item w/ def action change
  536.   {$EXTERNALSYM EVENT_OBJECT_DEFACTIONCHANGE}
  537.   EVENT_OBJECT_ACCELERATORCHANGE = $8012; // hwnd + ID + idChild is item w/ keybd accel change
  538.   {$EXTERNALSYM EVENT_OBJECT_ACCELERATORCHANGE}
  539. implementation
  540. const
  541.   user32 = 'user32.dll';
  542. {$IFDEF DYNAMIC_LINK}
  543. var
  544.   _GetGUIThreadInfo: Pointer;
  545. function GetGUIThreadInfo;
  546. begin
  547.   GetProcedureAddress(_GetGUIThreadInfo, user32, 'GetGUIThreadInfo');
  548.   asm
  549.     mov esp, ebp
  550.     pop ebp
  551.     jmp [_GetGUIThreadInfo]
  552.   end;
  553. end;
  554. {$ELSE}
  555. function GetGUIThreadInfo; external user32 name 'GetGUIThreadInfo';
  556. {$ENDIF DYNAMIC_LINK}
  557. {$IFDEF DYNAMIC_LINK}
  558. var
  559.   _GetWindowModuleFileNameW: Pointer;
  560. function GetWindowModuleFileNameW;
  561. begin
  562.   GetProcedureAddress(_GetWindowModuleFileNameW, user32, 'GetWindowModuleFileNameW');
  563.   asm
  564.     mov esp, ebp
  565.     pop ebp
  566.     jmp [_GetWindowModuleFileNameW]
  567.   end;
  568. end;
  569. {$ELSE}
  570. function GetWindowModuleFileNameW; external user32 name 'GetWindowModuleFileNameW';
  571. {$ENDIF DYNAMIC_LINK}
  572. {$IFDEF DYNAMIC_LINK}
  573. var
  574.   _GetWindowModuleFileNameA: Pointer;
  575. function GetWindowModuleFileNameA;
  576. begin
  577.   GetProcedureAddress(_GetWindowModuleFileNameA, user32, 'GetWindowModuleFileNameA');
  578.   asm
  579.     mov esp, ebp
  580.     pop ebp
  581.     jmp [_GetWindowModuleFileNameA]
  582.   end;
  583. end;
  584. {$ELSE}
  585. function GetWindowModuleFileNameA; external user32 name 'GetWindowModuleFileNameA';
  586. {$ENDIF DYNAMIC_LINK}
  587. {$IFDEF UNICODE}
  588. {$IFDEF DYNAMIC_LINK}
  589. var
  590.   _GetWindowModuleFileName: Pointer;
  591. function GetWindowModuleFileName;
  592. begin
  593.   GetProcedureAddress(_GetWindowModuleFileName, user32, 'GetWindowModuleFileNameW');
  594.   asm
  595.     mov esp, ebp
  596.     pop ebp
  597.     jmp [_GetWindowModuleFileName]
  598.   end;
  599. end;
  600. {$ELSE}
  601. function GetWindowModuleFileName; external user32 name 'GetWindowModuleFileNameW';
  602. {$ENDIF DYNAMIC_LINK}
  603. {$ELSE}
  604. {$IFDEF DYNAMIC_LINK}
  605. var
  606.   _GetWindowModuleFileName: Pointer;
  607. function GetWindowModuleFileName;
  608. begin
  609.   GetProcedureAddress(_GetWindowModuleFileName, user32, 'GetWindowModuleFileNameA');
  610.   asm
  611.     mov esp, ebp
  612.     pop ebp
  613.     jmp [_GetWindowModuleFileName]
  614.   end;
  615. end;
  616. {$ELSE}
  617. function GetWindowModuleFileName; external user32 name 'GetWindowModuleFileNameA';
  618. {$ENDIF DYNAMIC_LINK}
  619. {$ENDIF}
  620. {$IFDEF DYNAMIC_LINK}
  621. var
  622.   _BlockInput: Pointer;
  623. function BlockInput;
  624. begin
  625.   GetProcedureAddress(_BlockInput, user32, 'BlockInput');
  626.   asm
  627.     mov esp, ebp
  628.     pop ebp
  629.     jmp [_BlockInput]
  630.   end;
  631. end;
  632. {$ELSE}
  633. function BlockInput; external user32 name 'BlockInput';
  634. {$ENDIF DYNAMIC_LINK}
  635. {$IFDEF DYNAMIC_LINK}
  636. var
  637.   _SendInput: Pointer;
  638. function SendInput;
  639. begin
  640.   GetProcedureAddress(_SendInput, user32, 'SendInput');
  641.   asm
  642.     mov esp, ebp
  643.     pop ebp
  644.     jmp [_SendInput]
  645.   end;
  646. end;
  647. {$ELSE}
  648. function SendInput; external user32 name 'SendInput';
  649. {$ENDIF DYNAMIC_LINK}
  650. {$IFDEF DYNAMIC_LINK}
  651. var
  652.   _NotifyWinEvent: Pointer;
  653. procedure NotifyWinEvent;
  654. begin
  655.   GetProcedureAddress(_NotifyWinEvent, user32, 'NotifyWinEvent');
  656.   asm
  657.     mov esp, ebp
  658.     pop ebp
  659.     jmp [_NotifyWinEvent]
  660.   end;
  661. end;
  662. {$ELSE}
  663. procedure NotifyWinEvent; external user32 name 'NotifyWinEvent';
  664. {$ENDIF DYNAMIC_LINK}
  665. {$IFDEF DYNAMIC_LINK}
  666. var
  667.   _SetWinEventHook: Pointer;
  668. function SetWinEventHook;
  669. begin
  670.   GetProcedureAddress(_SetWinEventHook, user32, 'SetWinEventHook');
  671.   asm
  672.     mov esp, ebp
  673.     pop ebp
  674.     jmp [_SetWinEventHook]
  675.   end;
  676. end;
  677. {$ELSE}
  678. function SetWinEventHook; external user32 name 'SetWinEventHook';
  679. {$ENDIF DYNAMIC_LINK}
  680. {$IFDEF DYNAMIC_LINK}
  681. var
  682.   _UnhookWinEvent: Pointer;
  683. function UnhookWinEvent;
  684. begin
  685.   GetProcedureAddress(_UnhookWinEvent, user32, 'UnhookWinEvent');
  686.   asm
  687.     mov esp, ebp
  688.     pop ebp
  689.     jmp [_UnhookWinEvent]
  690.   end;
  691. end;
  692. {$ELSE}
  693. function UnhookWinEvent; external user32 name 'UnhookWinEvent';
  694. {$ENDIF DYNAMIC_LINK}
  695. end.