커서가 다른 스레드에 의해 제어되는 경우 GetCursor() 응용 프로그램 인터페이스를 사용하여 커서 핸들을 얻을 수 없습니다. 이 문서에서는 스레드가 커서를 제어할 때 커서 핸들을 얻는 방법에 대해 설명합니다.
================================================= =======
{
커서가 다른 스레드에 의해 제어되는 경우 GetCursor() 응용 프로그램 인터페이스를 사용하여 커서 핸들을 얻을 수 없습니다.
이 문서에서는 스레드가 커서를 제어할 때 커서 핸들을 얻는 방법에 대해 설명합니다.
예를 들어, 화면 캡처 프로그램에 커서를 놓고 싶을 때 어떻게 해야 할까요?
}
함수 GetCursorHandle: HCURSOR;
var
hWindow: 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) 그러면
시작하다
if AttachThreadInput(dwCurrentThreadID, dwThreadID, True) 다음
시작하다
//커서 핸들 얻기
결과 := GetCursor;
AttachThreadInput(dwCurrentThreadID, dwThreadID, False);
끝;
다른 끝
시작하다
결과 := GetCursor;
끝;
끝;
절차 TForm1.Button1Click(Sender: TObject);
var
CurPosX, CurPoxY: 정수;
마이커서: 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;
var
hWindow: 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) 그러면
시작하다
if AttachThreadInput(dwCurrentThreadID, dwThreadID, True) 다음
시작하다
//커서 핸들 얻기
결과 := GetCursor;
AttachThreadInput(dwCurrentThreadID, dwThreadID, False);
끝;
다른 끝
시작하다
결과 := GetCursor;
끝;
끝;
절차 TForm1.Button1Click(Sender: TObject);
var
CurPosX, CurPoxY: 정수;
마이커서: 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(Sender: TObject);
var
CI:TCursor정보;
시작하다
CI.cbSize := SizeOf(CI);
GetCursorInfo(CI);
Image1.Picture.Icon.Handle := CI.hCursor;
끝;
MyCursor.ReleaseHandle;
MyCursor.Free;
끝;
끝;
//또 다른 해결책:
절차 TForm1.Timer1Timer(Sender: TObject);
var
CI:TCursor정보;
시작하다
CI.cbSize := SizeOf(CI);
GetCursorInfo(CI);
Image1.Picture.Icon.Handle := CI.hCursor;
끝;