注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

BCB-DG's Blog

...

 
 
 

日志

 
 

GetCursor  

2007-08-04 15:54:49|  分类: VNC |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

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

****************************************************

function CaptureScreen:TBitmap;
var
 DC : HDC;
 ABitmap  : TBitmap;
 CI: TCursorInfo;
begin
 DC := GetDC(GetDesktopWindow);
 ABitmap := TBitmap.Create;
 try
    ABitmap.Width := GetDeviceCaps(DC,HORZRES);
    ABitmap.Height := GetDeviceCaps(DC,VERTRES);
    BitBlt(ABitmap.Canvas.Handle,
           0,
           0,
           ABitmap.Width,
           ABitmap.Height,
           DC,
           0,
           0,
           SRCCOPY);
    ZeroMemory(@CI,SizeOf(CI));
    CI.cbSize := SizeOf(CI);
    if GetCursorInfo(CI) then
    DrawIconEx(ABitmap.Canvas.Handle,
               CI.ptScreenPos.X,
               CI.ptScreenPos.Y,
               CI.hCursor,
               16,
               16,
               0,
               0,
               DI_DEFAULTSIZE OR DI_NORMAL);

 finally
    ReleaseDC(GetDesktopWindow,DC);
 end;
 Result := ABitmap;
end;

****************************************************

  评论这张
 
阅读(1411)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017