Delphi:获取其他线程的光标句柄
来源:优易学  2011-10-10 10:16:30   【优易学:中国教育考试门户网】   资料下载   IT书店

  当光标被另外一个线程掌握时,就无法用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;

责任编辑:小草

文章搜索:
 相关文章
热点资讯
资讯快报
热门课程培训