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

原创 2002年04月27日 09:18:00

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

Delphi获取焦点所在的控件名

var   F: string; begin   F := ActiveControl.Name;   ShowMessage(F); end;
  • zisongjia
  • zisongjia
  • 2017年06月01日 17:50
  • 1218

DELPHI获取鼠标当前句柄并执行操作

  • 2016年02月13日 16:22
  • 4KB
  • 下载

Windows句柄和API函数介绍以及常用的API函数

windows操作系统中所谓句柄是惟一标识某个Windows对象(例如程序实例、窗口、光标、图标、画刷和菜单等)的一个32位无符号整数,句柄是Windows对象的唯一标识符,只有有了句柄,程序才能使用...
  • chen_jie_2010
  • chen_jie_2010
  • 2011年07月14日 21:58
  • 4390

获得窗体指针的办法FromHandle,WindowFromPoint

HWND hWnd = GetSafeHwnd(); CWnd* pWnd = FromHandle(hWnd); CPoint point; GetCursorPos(&point); CWnd...
  • hczhiyue
  • hczhiyue
  • 2011年09月07日 11:40
  • 648

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

当光标被另外一个线程掌握时,就无法用GetCursor()应用接口获得光标句柄。本文阐述如何在任何线程掌握光标时都能够获取光标句柄。 =================================...
  • ChinaOk
  • ChinaOk
  • 2002年04月27日 09:18
  • 1133

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

当光标被另外一个线程掌握时,就无法用GetCursor()应用接口获得光标句柄。本文阐述如何在任何线程掌握光标时都能够获取光标句柄。 =================================...
  • mitta
  • mitta
  • 2008年12月19日 23:57
  • 497

进程和线程句柄和ID之间转换函数

//获取当前进程句柄 HANDLE GetCurrentProcess(VOID); //获取当前线程句柄 HANDLE GetCurrentThread(VOID); //获...
  • xiaoyafang123
  • xiaoyafang123
  • 2016年09月16日 22:08
  • 582

handle句柄

1、   句柄是一种指向指针的指针。我们知 道,所谓指针是一种内存地址。应用程序启动后,组成这个程序的各对象是住留在内存的。如果简单地理解,似乎我们只要获知这个内存的首地址,那么就可以随时用这个地址 ...
  • sheldon761642718
  • sheldon761642718
  • 2016年07月15日 15:43
  • 2907

C/C++ Windows API——获取鼠标位置的窗口句柄

// SpyDemo.cpp : 定义控制台应用程序的入口点。 //#include "stdafx.h" #include #define MAX_TEXT_LEN 255BOOL CALLBACK...
  • chy555chy
  • chy555chy
  • 2016年10月23日 11:43
  • 4313

Delphi中如何获得光标

就是我想在程序中使光标所在的文本框标一个颜色,当光标一走的时候又回到原来的颜色 可以截获WM_SETFOCUS、WM_KILLFOCUS消息: type TForm1 = c...
  • chinajobs
  • chinajobs
  • 2016年02月05日 14:23
  • 675
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:获取其他线程的光标句柄[DELPHI]
举报原因:
原因补充:

(最多只允许输入30个字)