カーソルが別のスレッドによって制御されている場合、GetCursor() アプリケーション インターフェイスを使用してカーソル ハンドルを取得することはできません。この記事では、スレッドがカーソルを制御しているときにカーソル ハンドルを取得する方法について説明します。
================================================= =======
{
カーソルが別のスレッドによって制御されている場合、GetCursor() アプリケーション インターフェイスを使用してカーソル ハンドルを取得することはできません。
この記事では、スレッドがカーソルを制御しているときにカーソル ハンドルを取得する方法について説明します。
たとえば、スクリーン キャプチャ プログラムにカーソルを置きたい場合はどうすればよいかなどです。
}
関数 GetCursorHandle: HCURSOR;
変数
hウィンドウ: HWND;
pt: Tポイント;
pIconInfo: TIconInfo;
dwThreadID、dwCurrentThreadID: DWord;
始める
// どのフォームにカーソルがあるかを確認します
GetCursorPos(pt);
hWindow := WindowFromPoint(pt);
// カーソル所有者のスレッド ID を取得します
dwThreadID := GetWindowThreadPROcessId(hWindow, nil);
// 現在のスレッドの ID を取得します
dwCurrentThreadID := GetCurrentThreadId;
// カーソル所有者のスレッドが現在のスレッドではない場合、カーソル所有者のスレッドを現在のスレッドに割り当てる必要があります。
//次に GetCursor() を呼び出して、正しいカーソル ハンドル (hCursor) を取得します。
if (dwCurrentThreadID <> dwThreadID) then
始める
if AttachThreadInput(dwCurrentThreadID, dwThreadID, True) then
始める
//カーソルハンドルを取得
結果 := GetCursor;
AttachThreadInput(dwCurrentThreadID, dwThreadID, False);
終わり;
それ以外で終了
始める
結果 := GetCursor;
終わり;
終わり;
プロシージャ TForm1.Button1Click(送信者: TObject);
変数
CurPosX、CurPoxY: 整数。
MyCursor: TIcon;
pIconInfo: TIconInfo;
始める
MyCursor := TIcon.Create;
試す
MyCursor.Handle := GetCursorHandle;
// カーソル位置を取得
GetIconInfo(MyCursor.Handle, pIconInfo);
CurPosX := pIconInfo.xHotspot;
CurPoxY := pIconInfo.yHotspot;
//フォーム上にカーソルを描画します
Canvas.Draw(CurPoxY, CurPoxY, MyCursor);
ついに
カーソルが別のスレッドによって制御されている場合、GetCursor() アプリケーション インターフェイスを使用してカーソル ハンドルを取得することはできません。この記事では、スレッドがカーソルを制御しているときにカーソル ハンドルを取得する方法について説明します。
================================================= =======
{
カーソルが別のスレッドによって制御されている場合、GetCursor() アプリケーション インターフェイスを使用してカーソル ハンドルを取得することはできません。
この記事では、スレッドがカーソルを制御しているときにカーソル ハンドルを取得する方法について説明します。
たとえば、スクリーン キャプチャ プログラムにカーソルを置きたい場合はどうすればよいかなどです。
}
関数 GetCursorHandle: HCURSOR;
変数
hウィンドウ: HWND;
pt: Tポイント;
pIconInfo: TIconInfo;
dwThreadID、dwCurrentThreadID: DWORD;
始める
// どのフォームにカーソルがあるかを確認します
GetCursorPos(pt);
hWindow := WindowFromPoint(pt);
// カーソル所有者のスレッド ID を取得します
dwThreadID := GetWindowThreadProcessId(hWindow, nil);
// 現在のスレッドの ID を取得します
dwCurrentThreadID := GetCurrentThreadId;
// カーソル所有者のスレッドが現在のスレッドではない場合、カーソル所有者のスレッドを現在のスレッドに割り当てる必要があります。
//次に GetCursor() を呼び出して、正しいカーソル ハンドル (hCursor) を取得します。
if (dwCurrentThreadID <> dwThreadID) then
始める
if AttachThreadInput(dwCurrentThreadID, dwThreadID, True) then
始める
//カーソルハンドルを取得
結果 := GetCursor;
AttachThreadInput(dwCurrentThreadID, dwThreadID, False);
終わり;
それ以外で終了
始める
結果 := GetCursor;
終わり;
終わり;
プロシージャ TForm1.Button1Click(送信者: TObject);
変数
CurPosX、CurPoxY: 整数。
MyCursor: TIcon;
pIconInfo: TIconInfo;
始める
MyCursor := TIcon.Create;
試す
MyCursor.Handle := GetCursorHandle;
// カーソル位置を取得
GetIconInfo(MyCursor.Handle, pIconInfo);
CurPosX := pIconInfo.xHotspot;
CurPoxY := pIconInfo.yHotspot;
//フォーム上にカーソルを描画します
Canvas.Draw(CurPoxY, CurPoxY, MyCursor);
ついに
MyCursor.ReleaseHandle;
MyCursor.Free;
終わり;
終わり;
//別の解決策:
プロシージャ TForm1.Timer1Timer(送信者: TObject);
変数
CI:TCursorInfo;
始める
CI.cbSize := サイズOf(CI);
GetCursorInfo(CI);
Image1.Picture.Icon.Handle := CI.hCursor;
終わり;
MyCursor.ReleaseHandle;
MyCursor.Free;
終わり;
終わり;
//別の解決策:
プロシージャ TForm1.Timer1Timer(送信者: TObject);
変数
CI:TCursorInfo;
始める
CI.cbSize := サイズOf(CI);
GetCursorInfo(CI);
Image1.Picture.Icon.Handle := CI.hCursor;
終わり;