unitduphandle.pas

来自「Delphi Win32核心API参考光盘源码 本书包含了常用的Windows」· PAS 代码 · 共 88 行

PAS
88
字号
unit UnitDupHandle;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Gauges, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  ThreadHandle: THandle;         // holds a handle to the current thread
  TargetHandle: THandle;         // holds a duplicated thread handle

implementation

{$R *.DFM}

function ThreadFunc(Info: Pointer): Integer;
var
  ICount: Integer;     // general loop counter
  FormDC: HDC;         // holds the form device context
begin
  {get a handle to the form's device context}
  FormDC := GetDC(Form1.Handle);

  {display something visual}
  for ICount := 1 to 10000 do
    TextOut(FormDC, 10, 50, PChar(IntToStr(ICount)), Length(IntToStr(ICount)));

  {pause the thread until ResumeThread is called, note SuspendThread
   is called with the duplicated handle}
  SuspendThread(TargetHandle);

  {display something visual}
  for ICount := 1 to 10000 do
    TextOut(FormDC, 110, 50, PChar(IntToStr(ICount)), Length(IntToStr(ICount)));

  {release the form's device context}
  ReleaseDC(Form1.Handle, FormDC);

  {end the thread}
  ExitThread(5);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Duplicated: Bool;          // holds the result of handle duplication
  CurrentProcess: THandle;   // holds the current process handle
  CurrentThread: THandle;    // holds the current thread identifier
  ThreadId: DWORD;           // holds the created thread identifier
begin
  {Create The thread and start it immediately}
  ThreadHandle := CreateThread(nil, 0, @ThreadFunc, nil, 0, ThreadId);

  {retrieve the current process and thread}
  CurrentProcess := GetCurrentProcess;
  CurrentThread := GetCurrentThread;

  {duplicate the handle of the created thread into TargetHandle}
  Duplicated := DuplicateHandle(CurrentProcess, ThreadHandle, CurrentProcess,
                                @TargetHandle, 0, FALSE, DUPLICATE_SAME_ACCESS);

  {indicate if there was an error}
  if not(Duplicated) then
  begin
    ShowMessage('The duplication did not work');
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  {Start the thread agian after the pause, note ResumeThread is called with the
  duplicated handle}
  ResumeThread(TargetHandle);
end;

end.

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?