怎么获取其他线程的光标句柄

解决方案 »

  1.   

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