2008-10-12 2 views
3

가능한 한 정확하게 Windows OS에서 시스템 커서를 비트 맵으로 캡처하고 싶습니다. 제공된 API는 내 지식 GetCursorInfo, DrawIconEx입니다.애니메이션 시스템 커서의 어느 단계가 Windows에 표시되고 있는지 파악하십시오.

행동의 간단한 체인은 다음과 같습니다

  • 이 DrawIconEx를 사용하여 메모리 DC에있는 커서를 페인트
  • GetCursorInfo
  • 를 사용하여 커서를 가져옵니다.

다음은 코드의 대략적인 모습입니다.

CURSORINFO CursorInfo; 

(VOID)memset(&CursorInfo, 0, sizeof(CursorInfo)); 
CursorInfo.cbSize = sizeof(CursorInfo); 

if (GetCursorInfo(&CursorInfo) && 
    CursorInfo.hCursor) 
{ 
    // ... create here the memory DC, memory bitmap 

    boError |= !DrawIconEx(hCursorDC, // device context 
     0,    // xLeft 
     0,    // yTop 
     CursorInfo.hCursor,  // cursor handle 
     0,    // width, use system default 
     0,    // height, use system default 
     0,    // step of animated cursor !!!!!!!!! 
     NULL,    // flicker free brush, don't use it now 
     DI_MASK | DI_DEFAULTSIZE); // flags 

    // ... do whatever we want with the cursor in our memory DC 
} 

지금, 아무도 내가 (나는 ... 다음 DrawIconEx의 istepIfAniCur 매개 변수에 전달 될 수있는 가치를 필요로) 그려되고있는 애니메이션 커서의 단계를 얻을 수있는 방법을 알고? 현재 위의 코드는 항상 애니메이션 커서의 첫 번째 단계 만 렌더링합니다.

나는 이것이 쉽게 끝나지 않는다고 생각하지만, 어쨌든 물어볼 가치가있다.

답변

2

를 불행하게도, 내가 커서 애니메이션의 현재 프레임을 개시 윈도우 API가 있다고 생각하지 않습니다. 스냅 샷을 만드는 순간에 커서 모양을 보았습니다.

0

단계가 누락 된 것 같습니다.

비트 맵을 생성하여 장치 컨텍스트에 선택해야합니다. 그렇지 않으면 비트 맵이 단일 픽셀입니다. MSDN 설명서에

참조 CreateCompatibleBitmap는 : DrawIconEx와

 
HBITMAP CreateCompatibleBitmap(
    HDC hdc,  // handle to DC 
    int nWidth,  // width of bitmap, in pixels 
    int nHeight  // height of bitmap, in pixels 
); 

UINT istepIfAniCur 매개 변수는 당신이 애니메이션 커서의 경우 그릴 수있는 프레임을 선택할 수 있습니다.

그것은 당신의 의견이 그것을 말한다 :

 
0, // step of animated cursor 
+0

안녕하세요 David, 나는 그 값을 DrawIconEx에 전달할 수 있도록 애니메이션 커서의 어느 단계가 그려지는지 알아야합니다. DC 작성에 대한 설명은 DC 작성, 비트 맵 작성, 비트 맵 선택에 대한 모든 코드를 대체합니다. 그것은 문제가 아닙니다. –

+0

흠. 거의 다른 질문입니다. 필자는 시스템 후크 기능 중 일부를 살펴볼 것입니다. 하지만 거기에 있을지는 의문입니다. –

+1

어떻게 든 현재 프레임을 알아내는 데 성공하면 DrawIconEx는 디스크에 파일로 존재하지 않는 애니메이션 커서에서 작동하지 않는다는 사실에 실망하게됩니다. 이 제한 사항은 일반적으로 다른 응용 프로그램의 커서에 액세스하는 데까지 확장됩니다. Wine 프로젝트에서이 작업을 위해 많은 시간을 보냈는데 GetCursorFrameInfo()를 사용하여 다양한 유형의 애니메이션 커서에서 프레임을 제대로 가져와야한다는 사실을 발견했습니다. – Compholio

관련 문제