• 用代码关闭冰刃(IceSword)


    (*
    冰刃这个系统分析工具以前还没用过。
    这样高级的工具,用结束进程的方式就不试了。
    按手工关闭的流程实现。
    首先是通过遍历当前进程,确定冰刃进程的主窗体;
    然后发送WM_CLOSE关闭主窗体。
    当关闭对话框出现的时候,最后就是模拟点击确定按钮。
    具体实现的时候要注意亮点:
    1、不能使用SendMessage发送WM_CLOSE消息,而用PostMessage替代。
      否则要等到关闭对话框结束才处理后面的语句。这就找不到关闭对话框的句柄了。
    2、确定按钮要点击两次。
      纯属测试的结果。
    *)

    uses TlHelp32;

    type
      TMainWindow = packed record
        ProcessID: THandle;
        MainWindow: THandle;
      end;
      PMainWindow = ^TMainWindow;

    function IsMainWindow(AHandle: THandle): Boolean;
    begin
      Result := (GetWindow(AHandle, GW_OWNER) = 0) and (IsWindowVisible(AHandle));
    end; { IsMainWindow }

    function fFindMainWindow(hWnd: THandle; lParam: PMainWindow): BOOL; stdcall;
    var
      vProcessID: THandle;
    begin
      GetWindowThreadProcessId(hWnd, vProcessID);
      if (lParam^.ProcessID = vProcessID) and IsMainWindow(hWnd) then
      begin
        lParam^.MainWindow := hWnd;
        Result := False;
      end else Result := True;
    end;

    function FindMainWindow(AProcessID: THandle): THandle;
    var
      vMainWindow: TMainWindow;
    begin
      vMainWindow.ProcessID := AProcessID;
      vMainWindow.MainWindow := 0;
      EnumWindows(@fFindMainWindow, Integer(@vMainWindow));
      Result := vMainWindow.MainWindow;
    end; { FindMainWindow }

    procedure TForm1.Button1Click(Sender: TObject);
    var
      vSnapshot: THandle;
      vProcessEntry32: TProcessEntry32;
      vHandle: THandle;
    begin
      vSnapshot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
      vProcessEntry32.dwSize := SizeOf(TProcessEntry32);
      if Process32First(vSnapshot, vProcessEntry32) then
        repeat
          if SameText('icesword.exe', vProcessEntry32.szExeFile) then
          begin
            vHandle := FindMainWindow(vProcessEntry32.th32ProcessID);
            if vHandle <> 0 then
            begin
              PostMessage(vHandle, WM_CLOSE, 0, 0); // 发送关闭消息
              Sleep(100); // 等待对话框出现
              vHandle := FindWindow('#32770', 'IceSword');
              if vHandle <> 0 then
              begin
                vHandle := FindWindowEx(vHandle, 0, 'Button', nil);
                SendMessage(vHandle, WM_LBUTTONDOWN, 0, 0);
                SendMessage(vHandle, WM_LBUTTONUP, 0, 0);
                ///...点击按钮两次
                SendMessage(vHandle, WM_LBUTTONDOWN, 0, 0);
                SendMessage(vHandle, WM_LBUTTONUP, 0, 0);
              end;
            end;
            Break;
          end;
        until not Process32Next(vSnapshot, vProcessEntry32);
      CloseHandle(vSnapshot);
    end;

    http://blog.csdn.net/zswang/article/details/2041123

  • 相关阅读:
    TransactSQL语言 学习sql server2005 step by step(四)
    一步一步学习C#(一)
    SQL实例进阶学习sql server2005 step by step(八)
    SQL Server中常用全局变量和函数 学习sql server2005 step by step(五)
    SQL实例进阶学习sql server2005 step by step(七)
    C#操作excel(开篇)
    SQL进阶提升(平时小积累)学习sql server2005 step by step(十)
    mysql 备份各种方法
    ubuntu 这可怕的弹出窗口啊“Enter password to unlock your login keyring”
    很简单的内核模块A+B
  • 原文地址:https://www.cnblogs.com/findumars/p/6347991.html
Copyright © 2020-2023  润新知