国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Delphi > 正文

獲取其他線程的光標句柄[DELPHI]

2019-11-18 18:40:53
字體:
來源:轉載
供稿:網友
 

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


上一篇:Delphi與Excel的親密接觸

下一篇:談Delphi下Internet的編程技巧(一)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
學習交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網友關注

主站蜘蛛池模板: 云安县| 乌苏市| 宜黄县| 防城港市| 临颍县| 德江县| 乌什县| 岗巴县| 苍梧县| 松江区| 义乌市| 延庆县| 康乐县| 上蔡县| 大化| 宿州市| 金川县| 通榆县| 深圳市| 和龙市| 惠来县| 明溪县| 惠东县| 邵武市| 古交市| 涿州市| 襄樊市| 历史| 阳谷县| 嵊泗县| 宝鸡市| 耒阳市| 报价| 苍南县| 毕节市| 澄城县| 平果县| 开化县| 桑日县| 革吉县| 永丰县|