WEB开发网
开发学院软件开发Delphi 获取其他线程的光标句柄[DELPHI] 阅读

获取其他线程的光标句柄[DELPHI]

 2006-02-04 13:37:20 来源:WEB开发网   
核心提示: 当光标被另外一个线程掌握时,就无法用GetCursor()应用接口获得光标句柄,获取其他线程的光标句柄[DELPHI],本文阐述如何在任何线程掌握光标时都能够获取光标句柄, ={当光标被另外一个线程掌握时,}function GetCursorHandle: HCURSOR;var hWindow: HWND;
 

当光标被另外一个线程掌握时,就无法用GetCursor()应用接口获得光标句柄。本文阐述如何在任何线程掌握光标时都能够获取光标句柄。

=========================================================

{
 当光标被另外一个线程掌握时,就无法用GetCursor()应用接口获得光标句柄。
 本文阐述如何在任何线程掌握光标时都能够获取光标句柄。
 例如,想在屏幕截取程序中放置光标时该如何做。
}

function GetCursorHandle: HCURSOR;
var
  hWindow: HWND;
  pt: TPoint;
  pIconInfo: TIconInfo;
  dwThreadID, dwCurrentThreadID: DWord;
begin
  // 检查哪个窗体掌握光标
  GetCursorPos(pt);
  hWindow := WindowFromPoint(pt);

  // 获得光标所有者的线程ID
  dwThreadID := GetWindowThreadPRocessId(hWindow, nil);

  // 获得当前线程的ID
  dwCurrentThreadID := GetCurrentThreadId;

  // 如果光标所有者的线程不是当前线程,就要把光标所有者的线程配属到当前线程。
  //然后调用GetCursor()来获得正确的光标句柄(hCursor)。

  if (dwCurrentThreadID <> dwThreadID) then
  begin
   if AttachThreadInput(dwCurrentThreadID, dwThreadID, True) then
   begin
    // 获得光标句柄
    Result := GetCursor;
    AttachThreadInput(dwCurrentThreadID, dwThreadID, False);
   end;
  end else
  begin
   Result := GetCursor;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  CurPosX, CurPoxY: Integer;
  MyCursor: TIcon;
  pIconInfo: TIconInfo;
begin
  MyCursor := TIcon.Create;
  try
   MyCursor.Handle := GetCursorHandle;
   // 获得光标位置
   GetIconInfo(MyCursor.Handle, pIconInfo);
   CurPosX := pIconInfo.xHotspot;
   CurPoxY := pIconInfo.yHotspot;
   // 在窗体上画出光标
   Canvas.Draw(CurPoxY, CurPoxY, MyCursor);
  finally

当光标被另外一个线程掌握时,就无法用GetCursor()应用接口获得光标句柄。本文阐述如何在任何线程掌握光标时都能够获取光标句柄。

=========================================================

{
 当光标被另外一个线程掌握时,就无法用GetCursor()应用接口获得光标句柄。
 本文阐述如何在任何线程掌握光标时都能够获取光标句柄。
 例如,想在屏幕截取程序中放置光标时该如何做。
}

function GetCursorHandle: HCURSOR;
var
  hWindow: HWND;
  pt: TPoint;
  pIconInfo: TIconInfo;
  dwThreadID, dwCurrentThreadID: DWORD;
begin
  // 检查哪个窗体掌握光标
  GetCursorPos(pt);
  hWindow := WindowFromPoint(pt);

  // 获得光标所有者的线程ID
  dwThreadID := GetWindowThreadProcessId(hWindow, nil);

  // 获得当前线程的ID
  dwCurrentThreadID := GetCurrentThreadId;

  // 如果光标所有者的线程不是当前线程,就要把光标所有者的线程配属到当前线程。
  //然后调用GetCursor()来获得正确的光标句柄(hCursor)。

  if (dwCurrentThreadID <> dwThreadID) then
  begin
   if AttachThreadInput(dwCurrentThreadID, dwThreadID, True) then
   begin
    // 获得光标句柄
    Result := GetCursor;
    AttachThreadInput(dwCurrentThreadID, dwThreadID, False);
   end;
  end else
  begin
   Result := GetCursor;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  CurPosX, CurPoxY: Integer;
  MyCursor: TIcon;
  pIconInfo: TIconInfo;
begin
  MyCursor := TIcon.Create;
  try
   MyCursor.Handle := GetCursorHandle;
   // 获得光标位置
   GetIconInfo(MyCursor.Handle, pIconInfo);
   CurPosX := pIconInfo.xHotspot;
   CurPoxY := pIconInfo.yHotspot;
   // 在窗体上画出光标
   Canvas.Draw(CurPoxY, CurPoxY, MyCursor);
  finally
   MyCursor.ReleaseHandle;
   MyCursor.Free;
  end;
end;

// 另外一种解决办法:

procedure TForm1.Timer1Timer(Sender: TObject);
var
  CI: TCursorInfo;
begin
  CI.cbSize := SizeOf(CI);
  GetCursorInfo(CI);
  Image1.Picture.Icon.Handle := CI.hCursor;
end;

   MyCursor.ReleaseHandle;
   MyCursor.Free;
  end;
end;

// 另外一种解决办法:

procedure TForm1.Timer1Timer(Sender: TObject);
var
  CI: TCursorInfo;
begin
  CI.cbSize := SizeOf(CI);
  GetCursorInfo(CI);
  Image1.Picture.Icon.Handle := CI.hCursor;
end;

Tags:获取 其他 线程

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接