📄 jwawinable.pas
字号:
{******************************************************************************}
{ }
{ Hooking mechanism to receive system events interface Unit for Object Pascal }
{ }
{ Portions created by Microsoft are Copyright (C) 1995-2001 Microsoft }
{ Corporation. All Rights Reserved. }
{ }
{ The original file is: winable.h, released June 2000. The original Pascal }
{ code is: WinAble.pas, released December 2000. The initial developer of the }
{ Pascal code is Marcel van Brakel (brakelm@chello.nl). }
{ }
{ Portions created by Marcel van Brakel are Copyright (C) 1999-2001 }
{ Marcel van Brakel. All Rights Reserved. }
{ }
{ Obtained through: Joint Endeavour of Delphi Innovators (Project JEDI) }
{ }
{ You may retrieve the latest version of this file at the Project JEDI home }
{ page, located at http://delphi-jedi.org or my personal homepage located at }
{ http://members.chello.nl/m.vanbrakel2 }
{ }
{ The contents of this file are used with permission, subject to the Mozilla }
{ Public License Version 1.1 (the "License"); you may not use this file except }
{ in compliance with the License. You may obtain a copy of the License at }
{ http://www.mozilla.org/MPL/MPL-1.1.html }
{ }
{ Software distributed under the License is distributed on an "AS IS" basis, }
{ WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for }
{ the specific language governing rights and limitations under the License. }
{ }
{ Alternatively, the contents of this file may be used under the terms of the }
{ GNU Lesser General Public License (the "LGPL License"), in which case the }
{ provisions of the LGPL License are applicable instead of those above. }
{ If you wish to allow use of your version of this file only under the terms }
{ of the LGPL License and not to allow others to use your version of this file }
{ under the MPL, indicate your decision by deleting the provisions above and }
{ replace them with the notice and other provisions required by the LGPL }
{ License. If you do not delete the provisions above, a recipient may use }
{ your version of this file under either the MPL or the LGPL License. }
{ }
{ For more information about the LGPL: http://www.gnu.org/copyleft/lesser.html }
{ }
{******************************************************************************}
unit JwaWinAble;
{$WEAKPACKAGEUNIT}
{$HPPEMIT ''}
{$HPPEMIT '#include "WinAble.h"'}
{$HPPEMIT ''}
{$I WINDEFINES.INC}
interface
uses
JwaWinType;
//
// This gets GUI information out of context. If you pass in a NULL thread ID,
// we will get the 'global' information, using the foreground thread. This
// is guaranteed to be the real active window, focus window, etc. Yes, you
// could do it yourself by calling GetForegorundWindow, getting the thread ID
// of that window via GetWindowThreadProcessId, then passing the ID into
// GetGUIThreadInfo(). However, that takes three calls and aside from being
// a pain, anything could happen in the middle. So passing in NULL gets
// you stuff in one call and hence also works right.
//
type
LPGUITHREADINFO = ^GUITHREADINFO;
{$EXTERNALSYM LPGUITHREADINFO}
tagGUITHREADINFO = record
cbSize: DWORD;
flags: DWORD;
hwndActive: HWND;
hwndFocus: HWND;
hwndCapture: HWND;
hwndMenuOwner: HWND;
hwndMoveSize: HWND;
hwndCaret: HWND;
rcCaret: RECT;
end;
{$EXTERNALSYM tagGUITHREADINFO}
GUITHREADINFO = tagGUITHREADINFO;
{$EXTERNALSYM GUITHREADINFO}
TGuiThreadInfo = GUITHREADINFO;
PGuiThreadInfo = LPGUITHREADINFO;
const
GUI_CARETBLINKING = $00000001;
{$EXTERNALSYM GUI_CARETBLINKING}
GUI_INMOVESIZE = $00000002;
{$EXTERNALSYM GUI_INMOVESIZE}
GUI_INMENUMODE = $00000004;
{$EXTERNALSYM GUI_INMENUMODE}
GUI_SYSTEMMENUMODE = $00000008;
{$EXTERNALSYM GUI_SYSTEMMENUMODE}
GUI_POPUPMENUMODE = $00000010;
{$EXTERNALSYM GUI_POPUPMENUMODE}
function GetGUIThreadInfo(idThread: DWORD; var lpgui: GUITHREADINFO): BOOL; stdcall;
{$EXTERNALSYM GetGUIThreadInfo}
function GetWindowModuleFileNameW(hwnd: HWND; lpFileName: LPWSTR; cchFileName: UINT): UINT; stdcall;
{$EXTERNALSYM GetWindowModuleFileNameW}
function GetWindowModuleFileNameA(hwnd: HWND; lpFileName: LPSTR; cchFileName: UINT): UINT; stdcall;
{$EXTERNALSYM GetWindowModuleFileNameA}
{$IFDEF UNICODE}
function GetWindowModuleFileName(hwnd: HWND; lpFileName: LPWSTR; cchFileName: UINT): UINT; stdcall;
{$EXTERNALSYM GetWindowModuleFileName}
{$ELSE}
function GetWindowModuleFileName(hwnd: HWND; lpFileName: LPSTR; cchFileName: UINT): UINT; stdcall;
{$EXTERNALSYM GetWindowModuleFileName}
{$ENDIF}
//
// This returns FALSE if the caller doesn't have permissions to do this
// esp. if someone else is dorking with input. I.E., if some other thread
// disabled input, and thread 2 tries to diable/enable it, the call will
// fail since thread 1 has the cookie.
//
function BlockInput(fBlockIt: BOOL): BOOL; stdcall;
{$EXTERNALSYM BlockInput}
//
// Note that the dwFlags field uses the same flags as keybd_event and
// mouse_event, depending on what type of input this is.
//
type
LPMOUSEINPUT = ^MOUSEINPUT;
{$EXTERNALSYM LPMOUSEINPUT}
PMOUSEINPUT = ^MOUSEINPUT;
{$EXTERNALSYM PMOUSEINPUT}
tagMOUSEINPUT = record
dx: LONG;
dy: LONG;
mouseData: DWORD;
dwFlags: DWORD;
time: DWORD;
dwExtraInfo: DWORD;
end;
{$EXTERNALSYM tagMOUSEINPUT}
MOUSEINPUT = tagMOUSEINPUT;
{$EXTERNALSYM MOUSEINPUT}
TMouseInput = MOUSEINPUT;
LPKEYBDINPUT = ^KEYBDINPUT;
{$EXTERNALSYM LPKEYBDINPUT}
PKEYBDINPUT = ^KEYBDINPUT;
{$EXTERNALSYM PKEYBDINPUT}
tagKEYBDINPUT = record
wVk: WORD;
wScan: WORD;
dwFlags: DWORD;
time: DWORD;
dwExtraInfo: DWORD;
end;
{$EXTERNALSYM tagKEYBDINPUT}
KEYBDINPUT = tagKEYBDINPUT;
{$EXTERNALSYM KEYBDINPUT}
TKeybdInput = KEYBDINPUT;
LPHARDWAREINPUT = ^HARDWAREINPUT;
{$EXTERNALSYM LPHARDWAREINPUT}
PHARDWAREINPUT = ^HARDWAREINPUT;
{$EXTERNALSYM PHARDWAREINPUT}
tagHARDWAREINPUT = record
uMsg: DWORD;
wParamL: WORD;
wParamH: WORD;
dwExtraInfo: DWORD;
end;
{$EXTERNALSYM tagHARDWAREINPUT}
HARDWAREINPUT = tagHARDWAREINPUT;
{$EXTERNALSYM HARDWAREINPUT}
THardwareInput = HARDWAREINPUT;
const
INPUT_MOUSE = 0;
{$EXTERNALSYM INPUT_MOUSE}
INPUT_KEYBOARD = 1;
{$EXTERNALSYM INPUT_KEYBOARD}
INPUT_HARDWARE = 2;
{$EXTERNALSYM INPUT_HARDWARE}
type
LPINPUT = ^INPUT;
{$EXTERNALSYM LPINPUT}
PINPUT = ^INPUT;
{$EXTERNALSYM PINPUT}
tagINPUT = record
type_: DWORD;
case Integer of
0: (mi: MOUSEINPUT);
1: (ki: KEYBDINPUT);
2: (hi: HARDWAREINPUT);
end;
{$EXTERNALSYM tagINPUT}
INPUT = tagINPUT;
{$EXTERNALSYM INPUT}
TInput = INPUT;
//
// This returns the number of inputs played back. It will disable input
// first, play back as many as possible, then reenable input. In the middle
// it will pulse the RIT to make sure that the fixed input queue doesn't
// fill up.
//
function SendInput(cInputs: UINT; pInputs: LPINPUT; cbSize: Integer): UINT; stdcall;
{$EXTERNALSYM SendInput}
const
CCHILDREN_FRAME = 7;
{$EXTERNALSYM CCHILDREN_FRAME}
//
// This generates a notification that anyone watching for it will get.
// This call is superfast if nobody is hooking anything.
//
procedure NotifyWinEvent(event: DWORD; hwnd: HWND; idObject, idChild: LONG); stdcall;
{$EXTERNALSYM NotifyWinEvent}
//
// hwnd + idObject can be used with OLEACC.DLL's OleGetObjectFromWindow()
// to get an interface pointer to the container. indexChild is the item
// within the container in question. Setup a VARIANT with vt VT_I4 and
// lVal the indexChild and pass that in to all methods. Then you
// are raring to go.
//
//
// Common object IDs (cookies, only for sending WM_GETOBJECT to get at the
// thing in question). Positive IDs are reserved for apps (app specific),
// negative IDs are system things and are global, 0 means "just little old
// me".
//
const
CHILDID_SELF = 0;
{$EXTERNALSYM CHILDID_SELF}
// Reserved IDs for system objects
OBJID_WINDOW = DWORD($00000000);
{$EXTERNALSYM OBJID_WINDOW}
OBJID_SYSMENU = DWORD($FFFFFFFF);
{$EXTERNALSYM OBJID_SYSMENU}
OBJID_TITLEBAR = DWORD($FFFFFFFE);
{$EXTERNALSYM OBJID_TITLEBAR}
OBJID_MENU = DWORD($FFFFFFFD);
{$EXTERNALSYM OBJID_MENU}
OBJID_CLIENT = DWORD($FFFFFFFC);
{$EXTERNALSYM OBJID_CLIENT}
OBJID_VSCROLL = DWORD($FFFFFFFB);
{$EXTERNALSYM OBJID_VSCROLL}
OBJID_HSCROLL = DWORD($FFFFFFFA);
{$EXTERNALSYM OBJID_HSCROLL}
OBJID_SIZEGRIP = DWORD($FFFFFFF9);
{$EXTERNALSYM OBJID_SIZEGRIP}
OBJID_CARET = DWORD($FFFFFFF8);
{$EXTERNALSYM OBJID_CARET}
OBJID_CURSOR = DWORD($FFFFFFF7);
{$EXTERNALSYM OBJID_CURSOR}
OBJID_ALERT = DWORD($FFFFFFF6);
{$EXTERNALSYM OBJID_ALERT}
OBJID_SOUND = DWORD($FFFFFFF5);
{$EXTERNALSYM OBJID_SOUND}
//
// System Alerts (indexChild of system ALERT notification)
//
ALERT_SYSTEM_INFORMATIONAL = 1; // MB_INFORMATION
{$EXTERNALSYM ALERT_SYSTEM_INFORMATIONAL}
ALERT_SYSTEM_WARNING = 2; // MB_WARNING
{$EXTERNALSYM ALERT_SYSTEM_WARNING}
ALERT_SYSTEM_ERROR = 3; // MB_ERROR
{$EXTERNALSYM ALERT_SYSTEM_ERROR}
ALERT_SYSTEM_QUERY = 4; // MB_QUESTION
{$EXTERNALSYM ALERT_SYSTEM_QUERY}
ALERT_SYSTEM_CRITICAL = 5; // HardSysErrBox
{$EXTERNALSYM ALERT_SYSTEM_CRITICAL}
CALERT_SYSTEM = 6;
{$EXTERNALSYM CALERT_SYSTEM}
type
HWINEVENTHOOK = DWORD;
{$EXTERNALSYM HWINEVENTHOOK}
WINEVENTPROC = procedure (
hEvent: HWINEVENTHOOK;
event: DWORD;
hwnd: HWND;
idObject: LONG;
idChild: LONG;
idEventThread: DWORD;
dwmsEventTime: DWORD); stdcall;
{$EXTERNALSYM WINEVENTPROC}
TWinEventProc = WINEVENTPROC;
const
WINEVENT_OUTOFCONTEXT = $0000; // Events are ASYNC
{$EXTERNALSYM WINEVENT_OUTOFCONTEXT}
WINEVENT_SKIPOWNTHREAD = $0001; // Don't call back for events on installer's thread
{$EXTERNALSYM WINEVENT_SKIPOWNTHREAD}
WINEVENT_SKIPOWNPROCESS = $0002; // Don't call back for events on installer's process
{$EXTERNALSYM WINEVENT_SKIPOWNPROCESS}
WINEVENT_INCONTEXT = $0004; // Events are SYNC, this causes your dll to be injected into every process
{$EXTERNALSYM WINEVENT_INCONTEXT}
WINEVENT_32BITCALLER = $8000; // ;Internal
{$EXTERNALSYM WINEVENT_32BITCALLER}
WINEVENT_VALID = $8007; // ;Internal
{$EXTERNALSYM WINEVENT_VALID}
function SetWinEventHook(eventMin, eventMax: DWORD; hmodWinEventProc: HMODULE;
lpfnWinEventProc: WINEVENTPROC; idProcess, idThread, dwFlags: DWORD): HWINEVENTHOOK; stdcall;
{$EXTERNALSYM SetWinEventHook}
//
// Returns zero on failure, or a DWORD ID if success. We will clean up any
// event hooks installed by the current process when it goes away, if it
// hasn't cleaned the hooks up itself. But to dynamically unhook, call
// UnhookWinEvents().
//
function UnhookWinEvent(hEvent: HWINEVENTHOOK): BOOL; stdcall;
{$EXTERNALSYM UnhookWinEvent}
//
// If idProcess isn't zero but idThread is, will hook all threads in that
// process.
// If idThread isn't zero but idProcess is, will hook idThread only.
// If both are zero, will hook everything
//
//
// EVENT DEFINITION
//
const
EVENT_MIN = $00000001;
{$EXTERNALSYM EVENT_MIN}
EVENT_MAX = $7FFFFFFF;
{$EXTERNALSYM EVENT_MAX}
//
// EVENT_SYSTEM_SOUND
// Sent when a sound is played. Currently nothing is generating this, we
// are going to be cleaning up the SOUNDSENTRY feature in the control panel
// and will use this at that time. Applications implementing WinEvents
// are perfectly welcome to use it. Clients of IAccessible* will simply
// turn around and get back a non-visual object that describes the sound.
//
EVENT_SYSTEM_SOUND = $0001;
{$EXTERNALSYM EVENT_SYSTEM_SOUND}
//
// EVENT_SYSTEM_ALERT
// Sent when an alert needs to be given to the user. MessageBoxes generate
// alerts for example.
//
EVENT_SYSTEM_ALERT = $0002;
{$EXTERNALSYM EVENT_SYSTEM_ALERT}
//
// EVENT_SYSTEM_FOREGROUND
// Sent when the foreground (active) window changes, even if it is changing
// to another window in the same thread as the previous one.
//
EVENT_SYSTEM_FOREGROUND = $0003;
{$EXTERNALSYM EVENT_SYSTEM_FOREGROUND}
//
// EVENT_SYSTEM_MENUSTART
// EVENT_SYSTEM_MENUEND
// Sent when entering into and leaving from menu mode (system, app bar, and
// track popups).
//
EVENT_SYSTEM_MENUSTART = $0004;
{$EXTERNALSYM EVENT_SYSTEM_MENUSTART}
EVENT_SYSTEM_MENUEND = $0005;
{$EXTERNALSYM EVENT_SYSTEM_MENUEND}
//
// EVENT_SYSTEM_MENUPOPUPSTART
// EVENT_SYSTEM_MENUPOPUPEND
// Sent when a menu popup comes up and just before it is taken down. Note
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -