zoukankan      html  css  js  c++  java
  • 用代码关闭冰刃(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

  • 相关阅读:
    python3.4 + pycharm 环境安装 + pycharm使用
    ddt源码修改:HtmlTestRunner报告依据接口名显示用例名字
    re模块
    LeetCode Weekly Contest 12
    求解强连通分量
    几道题-找规律-记录并查找
    欧几里德算法
    树上二分
    几道题-博弈
    随便写一些东西-缩边
  • 原文地址:https://www.cnblogs.com/findumars/p/6347991.html
Copyright © 2011-2022 走看看