⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 skdemo.dpr

📁 这一系列是我平时收集的pascal深入核心编程
💻 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 + -