• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

delphi微信(WeChat)多开源代码

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

在网上看到一个C++代码示例:

原文地址:http://bbs.pediy.com/thread-217610.htm

觉得这是一个很好的调用 windows api 的示例,故将其转换成了 delphi xe8 

源码下载:OpenNewWechat

下面给出所用到的windows api 定义

unit uWinApi;

// http://bbs.pediy.com/thread-217610.htm
// 微信(WeChat)电脑端多开分析+源码

{  感谢原文提供的代码和 exe
   晓不得2013 qq 26562729
   2017-07-04
   // 本代码是学习 win api 的一个经典示例
   // 希望您会有所收获
}
interface

uses
  windows, TLHelp32, Generics.collections;

type

  PSystemHandle = ^TSystemHandle; // 此结构体未公开,找了很久才弄正确。

  TSystemHandle = packed record // 共16字节. 长度一定要准确。否则,后面没法玩。
    dwProcessID: THandle;
    bObjectType: Byte;
    bflags: Byte;
    wValue: Word;
    GrantedAcess: Int64;
  end;

  PSystemHandleList = ^TSystemHandleList;

  TSystemHandleList = record
    dwHandleCount: Cardinal; // 获取到的结果前4个字节,表示数量
    // 后面的就每 16 个字节一组,表示一个 TSystemHandle
    Handles: array of TSystemHandle; // 定义成下面这样,亦可行。
    // Handles:TSystemHandle; 只是不便于理解
  end;

  PProcessRec = ^TProcessRec;

  TProcessRec = record
    ProcessName: string;
    ProcessID: THandle;
  end;

  TProcessRecList = class(TList<PProcessRec>)
  public
    procedure FreeAllItem;
  end;

  // win 规则下,都是让调用者传入 buff 长度,然后检查这个长度是否合适
  // 如果不够,就返回一个错误,并且在 ASize 中指明需要的长度
  // 以便调用者重新分配 buff 再次调用
  // ASysInfoCls 是查询什么类别。 MS 没有全部公开. $10 为 SystemHanle.
  // ASysInfo 理解为 Buff 就行了。
function ZwQuerySystemInformation(ASysInfoCls: Integer; ASysInfo: Pointer; ABufLen: Cardinal;
  var ASize: Cardinal): Cardinal; stdcall; external 'ntdll.dll';


function NtQueryObject(Ahandle: THandle; AQuertyIndex: Integer; ABuff: Pointer; ABuffSize: Cardinal;
  var ASize: Cardinal): Cardinal; stdcall; external 'ntdll.dll';

// 获取当前的进程
function GetAllProcess: TProcessRecList;

implementation

{ TProcessRecList }

procedure TProcessRecList.FreeAllItem;
var
  p: PProcessRec;
begin
  for p in self do
    Dispose(p);
end;

function GetAllProcess: TProcessRecList;
var
  Entry32: TProcessEntry32W;
  SnapshotHandle: THandle;
  Found: boolean;
  sExeFileName: string;
  p: PProcessRec;
begin
  Result := TProcessRecList.Create;
  SnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  Entry32.dwSize := sizeof(Entry32);
  Found := Process32First(SnapshotHandle, Entry32);
  while Found do
  begin
    new(p);
    Result.Add(p);
    sExeFileName := Entry32.szExeFile;
    p.ProcessName := sExeFileName;
    p.ProcessID := Entry32.th32ProcessID;
    Found := Process32Next(SnapshotHandle, Entry32);
  end;
  CloseHandle(SnapshotHandle);
end;

end.

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Delphi启动数据库连接属性对话框发布时间:2022-07-18
下一篇:
delphi注册热键方法(一)发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap