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

  • 相关阅读:
    jsp学习笔记(一)
    20170215学习计划
    腾讯云CVM使用记录--使用root权限
    转:ASP.NET MVC3 Model验证总结
    ASP.NET MVC3更新出错:ObjectStateManager中已存在具有同一键的对象
    c#中如何将一个string数组转换为int数组
    转:自定义ASP.NET MVC Html辅助方法
    转:ASP.NET MVC扩展之HtmlHelper辅助方法
    自己用的一个ASP.Net MVC分页拿出来分享下(转)
    MVC分页控件之二,为IQueryable定义一个扩展方法,直接反回PagedList<T>结果集(转)
  • 原文地址:https://www.cnblogs.com/findumars/p/6347991.html
Copyright © 2011-2022 走看看