程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 獲取其他線程的光標句柄

獲取其他線程的光標句柄

編輯:Delphi

  當光標被另外一個線程掌握時,就無法用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;
  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved