📄 skdemo.dpr
字号:
program SKDemo;
{$R SKDemo.res}
uses Windows, Messages, SendKey in 'SendKey.pas';
const
MaxKeyStrBufferSize = 1024;
IDD_SKDEMO = 103; // 模板资源ID
IDI_SKDEMO = 104; // 图标资源ID
IDC_WINDOWS = 1000; // 控件ID..
IDC_KEYSTRING = 1001;
IDC_SENDKEYS = 1002;
IDC_WNDREFRESH = 1003;
// WM_INITDIALOG消息处理
function SKDemo_OnInitDialog(hWnd, hWndFocus: HWND; lParam: LPARAM): BOOL;
const
szKeyStrings: array[0..21] of PChar = (
'Some test string',
'%fonsetup.txt{Enter}',
'^{ESC}',
'Notify when playback complete{QueueSync}',
'{F1}',
'!@#$&*<>?:',
'z{Left}{Del}ABCD',
'xyz{Home}+{End}{Del}ABCD',
'{CAPSLOCK}abc{CAPSLOCK}abc',
'%',
'%+{TAB}',
'{{}Braces{}}',
'%F',
'{x 10}',
'{H 20}',
'{LeFt 5}',
'{%}{+}+{^}{D}',
'Error test: Missing close brace{ENTER',
'Error test: Invalid key {BOBO}',
'Error test: Missing close parenthesis+(jeff',
'Error test: Invalid count {z z}',
'Error test: String too long{J 3000}' );
var
x: Integer;
hWndCB: LongWord; // HWND
begin
// 初始化发送字串列表
hWndCB := GetDlgItem(hWnd, IDC_KEYSTRING);
SendMessage(hWndCB, CB_LIMITTEXT, MaxKeyStrBufferSize, 0);
for x := Low(szKeyStrings) to High(szKeyStrings) do
SendMessage(hWndCB, CB_ADDSTRING, 0, Integer(szKeyStrings[x]));
SendMessage(hWndCB, CB_SETCURSEL, 0, 0);
// 模拟点击'刷新'按钮
PostMessage(hWnd, WM_COMMAND, MakeWParam(IDC_WNDREFRESH, BN_CLICKED), GetDlgItem(hWnd, IDC_WNDREFRESH));
// 设置对话框窗体图标
SendMessage(hWnd, WM_SETICON, ICON_BIG, LoadIcon(HInstance, MakeIntResource(IDI_SKDEMO)));
// 接受默认的控件焦点
Result := TRUE;
end;
const
g_szSKErrors: array[1..6] of PChar = (
'Missing close brace',
'Invalid key',
'Missing close parenthesis',
'Invalid count',
'String too long',
'Can'#$27't install hook' );
// WM_COMMAND消息处理
procedure SKDemo_OnCommand(hWnd: HWND; id: Integer; hWndCtl: HWND; codeNotify: UINT);
var
szBuf: array[0..MaxKeyStrBufferSize-1] of Char;
SKErr: TSKErr;
hWndCB, hWndT: LongWord; // HWND;
nIndex: Integer;
begin
case (id) of
IDC_WNDREFRESH: // 刷新
begin
hWndCB := GetDlgItem(hWnd, IDC_WINDOWS);
SendMessage(hWndCB, CB_RESETCONTENT, 0, 0);
hWndT := GetTopWindow(GetDesktopWindow());
while IsWindow(hWndT) do
begin
if IsWindowVisible(hWndT)then
begin
GetWindowText(hWndT, szBuf, SizeOf(szBuf));
if (szBuf[0] <> #0) then
begin
nIndex := SendMessage(hWndCB, CB_ADDSTRING, 0, Integer(@szBuf[0]));
SendMessage(hWndCB, CB_SETITEMDATA, nIndex, hWndT);
end;
end;
hWndT := GetWindow(hWndT, GW_HWNDNEXT);
end;
SendMessage(hWndCB, CB_SETCURSEL, 0, 0);
end;
IDC_SENDKEYS: // 发送
begin
hWndCB := GetDlgItem(hWnd, IDC_WINDOWS);
nIndex := SendMessage(hWndCB, CB_GETCURSEL, 0, 0);
hWndT := SendMessage(hWndCB, CB_GETITEMDATA, nIndex, 0);
if (IsWindow(hWndT) = FALSE) then
begin
MessageBox(GetActiveWindow(), 'Window no longer exists.', 'SKDemo', 0);
end else
begin
GetWindowText(GetDlgItem(hWnd, IDC_KEYSTRING), szBuf, SizeOf(szBuf));
SKErr := SendKeys(hWnd, szBuf); // **
if (SKErr <> SKERR_NOERROR) then
begin
MessageBox(GetActiveWindow(), g_szSKErrors[Integer(SKErr)], 'SKDemo', 0);
end else
SetForegroundWindow(hWndT);
end;
end;
IDCANCEL: // 关闭
begin
PostQuitMessage(0);
end;
end;
end;
// WM_QUEUESYNC消息处理
procedure SKDemo_OnQueueSync(hWnd: HWND);
begin
MessageBox(GetActiveWindow(), 'Got WM_QUEUESYNC message!', 'SKDemo', 0);
end;
// 对话框消息处理回调
function SKDemo_DlgProc(hWnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM): BOOL; stdcall;
begin
case (uMsg) of
WM_INITDIALOG:
begin
Result := BOOL(SetWindowLong(hWnd, DWL_MSGRESULT,
Longint(SKDemo_OnInitDialog(hWnd, wParam, lParam))));
end;
WM_COMMAND:
begin
SKDemo_OnCommand(hWnd, LOWORD(wParam), lParam, HIWORD(wParam));
Result := TRUE;
end;
WM_QUEUESYNC:
begin
SKDemo_OnQueueSync(hWnd);
Result := TRUE;
end;
else Result := FALSE;
end;
end;
// 程序'主线程'入口
var
Msg: TMsg;
hWnd: LongWord; // HWND
begin
// 建立非模态对话框作为主窗体
// 并且自己作消息循环, (得以处理WM_CANCELJOURNAL)
hWnd := CreateDialog(HInstance, MakeIntResource(IDD_SKDEMO), 0, @SKDemo_DlgProc);
// 一直循环, 直至遇到WM_QUIT消息
while GetMessage(Msg, 0, 0, 0) do
begin
// 用户可以按下Ctrl+Esc取消回放, 系统会强行卸载回放钩子,
// 并向安装钩子的线程的消息队列放置一个目标窗口句柄为NULL的WM_CANCELJOURNAL消息
if (Msg.message = WM_CANCELJOURNAL) then
MessageBox(GetActiveWindow(), 'Sendkeys canceled by user', 'SKDemo', 0);
// 处理"对话框消息"
if (IsDialogMessage(hWnd, Msg) = FALSE) then
begin
// 其他消息正常处理
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end;
// 清除作为主窗体的非模态对话框
DestroyWindow(hWnd);
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -