(*
冰刃这个系统分析工具以前还没用过。
这样高级的工具,用结束进程的方式就不试了。
按手工关闭的流程实现。
首先是通过遍历当前进程,确定冰刃进程的主窗体;
然后发送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

用代码关闭冰刃(IceSword)的更多相关文章

  1. 冰刃IceSword中文版 V1.22 绿色汉化修正版

    软件名称: 冰刃IceSword中文版 V1.22 绿色汉化修正版 软件语言: 简体中文 授权方式: 免费软件 运行环境: Win 32位/64位 软件大小: 2.1MB 图片预览: 软件简介: Ic ...

  2. Ios8代码关闭输入预测问题

    自IOS8出来了输入预测问题后,有些问题也就来了比如textfield中输入邮箱的话,就会有很多空格无法去掉,当时我一直在找有没有提供什么方法可以关闭:后面有这样的一个属性可以解决输入邮箱没有空格问题 ...

  3. java代码关闭tomcat程序

    1.通过java代码实现tomcat的关闭 2.tomcatStop.java package test; import java.io.BufferedReader; import java.io. ...

  4. 使用java代码关闭指定端口的程序-windows

    转载请请在页首注明作者与出处 一:问题由史 今天遇到一个问题,就是在实现自动化灾备的时候,发现原有死掉的程序没有完全关闭,当然这都不是本文的重点,重点是这个时候,我得把它完全关闭,所以才有了这篇文章. ...

  5. iOS 通过代码关闭应用程序

    //-------------------------------- 退出程序 -----------------------------------------// - (void)exitAppl ...

  6. iOS通过代码关闭程序

    //-------------------------------- 退出程序 -----------------------------------------// - (void)exitAppl ...

  7. wordpress数据库优化-关闭日志修订

    每次在wordpress网站修改文章的时候都会产生一个修订版本,wp_posts会产生一个post_type为“REVISIONS”的记录,修改次数一多的话,那修订版本就有几万条记录了 在functi ...

  8. 在ubuntu下关闭笔记本触摸板

    http://www.cnblogs.com/icejoywoo/archive/2011/04/14/2016318.html 原文地址:http://forum.ubuntu.org.cn/vie ...

  9. iOS_16_开关控制器_modal_代码方法

    最后效果图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcHJlX2VtaW5lbnQ=/font/5a6L5L2T/fontsize/400/fill ...

随机推荐

  1. sql这两个表和查询的组合yii通过使用数据库查询

    sql两个表的组合查询  使用 join on 比如:两个表查询: select u.username, t.title from user u join task t on u.id = t.id; ...

  2. Hibernate——(5)持久化对象和一级缓存机制

    一.对象的三种状态 1.暂时态:当对象刚创建,和Session没有发生任何关系时,当程序运行完就即刻消失,被称为暂时态. 2.持久态:当执行如下代码时,对象变为持久态 Emp e = new Emp( ...

  3. dotnet core 通过修改文件头的方式隐藏控制台窗口

    原文:dotnet core 通过修改文件头的方式隐藏控制台窗口 在带界面的 dotnet core 程序运行的时候就会出现一个控制台窗口,本文告诉大家使用最简单方法去隐藏控制台窗口. 最近在使用 A ...

  4. Qt自定义密码框,先显示后隐藏(继承以后改写slot即可,即与哪个相近就改写哪个)good

    现在很多应用在密码输入时,会先显示一段时间,大概几百毫秒,然后再变成星号或者圆点隐藏起来.这样做的好处是,可以让密码输入者看到自己输入的字符,同时又防止密码被偷窥.但是Qt自带的密码输入框,要么输入时 ...

  5. unity3d 学习笔记(三)

    工作现场查看: 飞行模式: 按住鼠标右键 w s a d 围绕浏览当前视图, q e 上下浏览. 交模式下无效 需透视图 移动吸附:移动状态(w) ctrl+shif  移动吸附在其它物体上移动 顶点 ...

  6. DDD实战4 实现产品仓储

    a.要实现仓储,首先要定义仓储接口.在领域层定义仓储接口,IProductRepository.cs. public interface IProductRepository { void Creat ...

  7. 安装mysql5.7.17

    参见 网易云课堂的视频教程 :mysql视频教程

  8. 使用WPF创建画图箭头

    原文:使用WPF创建画图箭头 今天要给leader line画个箭头,所以就google一下,找到下面的文章,写的不错,可以实现我的需求,所以就摘录下来. 我把源代码中的arraw.cs加入到我的工程 ...

  9. 超平面(hyperplane)的定义

    Hyperplane - Wikipedia Hyperplane – from Wolfram MathWorld a1,a2,-,an 为一组不全为 0 的纯量,如下定义的集合 S 由这样的向量构 ...

  10. Cocos2d-x 3.1 一步一步地做改编

    本文并不想谈论的屏幕改编或真理的概念.假设不知道cocos2d-x的,请先看这篇文章:http://www.cocoachina.com/gamedev/cocos/2014/0516/8451.ht ...