마우스 커서가 32 비트에서 변경되지만 64 비트에서는 변경되지 않음

지샨 무갈

이 MAKEINTRESOURCE, GetClassLong, LOWORD ((LPSTR) cursor_name) 및 LoadCursor에서 64 비트와 호환되지 않는 것이 있습니까? 그렇다면 해결책은 무엇입니까? 내 코드는 32 비트에서는 잘 작동하지만 64 비트에서는 작동하지 않습니다. 코드는 거대한 응용 프로그램이며 사용되는 주요 기능은 위에 나열되어 있습니다. 함수에는 매개 변수 mouse_form이 있습니다.

  HCURSOR c_cursor, n_cursor;
  LPSTR cursor_name;

    switch( mouse_form )
    {
            case MOUSE_WIN_ARROW:
                    cursor_name = (LPSTR)IDC_ARROW;
                    break;

            case MOUSE_ARROW:
                    cursor_name = (LPSTR)IDC_ARROW;

                         #if (!(defined WIN32) && !(defined WIN64))


        if( environ_get_window_id() != -1 ) cursor_name = (LPSTR)IDCC_ELXHND;

    #endif
                    break;

            case MOUSE_CURSOR:
                    cursor_name = (LPSTR)IDC_IBEAM;
                    break;

            case MOUSE_HOURGLASS:
                    cursor_name = (LPSTR)IDC_WAIT;
                    break;

            case MOUSE_POINTING_HAND:

                        #if ((defined WIN32) || (defined WIN64))
                                cursor_name = (LPSTR)IDC_ARROW;
                        #else

                cursor_name = (LPSTR)IDCC_ELXHND;
                        #endif



                    break;

            case MOUSE_OPEN_HAND:
                    cursor_name = (LPSTR)IDC_ARROW;
                    break;

            case MOUSE_THIN_CROSS:
                    cursor_name = (LPSTR)IDC_CROSS;
                    break;

            case MOUSE_THICK_CROSS:
                    cursor_name = (LPSTR)IDC_CROSS;
                    break;

            case MOUSE_OUTLINED_CROSS:
                    cursor_name = (LPSTR)IDC_SIZE;
                    break;

            case MOUSE_MENU_ARROW:
                    cursor_name = (LPSTR)IDCC_ELXMEN;
                    break;

            default:
                    cursor_name=(LPSTR)MAKEINTRESOURCE( mouse_form );
    }

    n_cursor = environ_wload_cursor( cursor_name );

     #if ((defined WIN32) || (defined WIN64))

    if( environ_control->w_param) 
        c_cursor = (HCURSOR)GetClassLong( environ_control->w_param->awindow,(ELX_LONG) GCLP_HCURSOR );
    else
    c_cursor = (HCURSOR)GetWindowLong( GetForegroundWindow(),(ELX_LONG) GCLP_HCURSOR ); 

    #else
    c_cursor = GetClassWord( environ_control->w_param->awindow, GCW_HCURSOR );
    #endif

    #if ((defined WIN32) || (defined WIN64))

    if( environ_control->w_param) 
    {
    #endif
        if( !n_cursor )
        {
            if( environ_control->win_cptr->window_id == -1 )
            {
            n_cursor = ewcore_control.orig_cclient;
            }
            else
            {
            n_cursor = ewcore_control.orig_cchild;
            }
        }
        else environ_control->win_cptr->prev_cursor = c_cursor;
    #if ((defined WIN32) || (defined WIN64))
    }
        else
    {
        if( !n_cursor )
        {
            n_cursor = ewcore_control.orig_cclient;     
        }
        //else 
        //environ_control->win_cptr->prev_cursor = c_cursor;

    }
    #endif
    #if ((defined WIN32) || (defined WIN64))

    if(environ_control->w_param)
        SetClassLong( environ_control->w_param->awindow, GCLP_HCURSOR,(ELX_LONG)n_cursor );
    else
        SetWindowLong( GetForegroundWindow(), GCLP_HCURSOR, (ELX_LONG)n_cursor );

    #else
    SetClassWord( environ_control->w_param->awindow,GCW_HCURSOR, n_cursor );
    #endif
    SetCursor( n_cursor );
}
IInspectable

에 대한 MSDN 설명서에서 GetClassLong:

포인터 나 핸들을 검색하는 경우이 함수는 GetClassLongPtr 함수로 대체되었습니다. (포인터와 핸들은 32 비트 Windows에서 32 비트이고 64 비트 Windows에서 64 비트입니다.)

요컨대 : GetClassLongPtr대신 사용하십시오 .

에 대한 MSDN 설명서에서 GetClassWord:

이 함수는 GCW_ATOM으로 설정된 nIndex 이외의 용도로 더 이상 사용되지 않습니다. 이 기능은 Windows 16 비트 버전과의 호환성을 위해서만 제공됩니다. 응용 프로그램은 GetClassLongPtr 또는 GetClassLongPtr 함수를 사용해야합니다.

SetClassLong, GetWindowLong에도 동일하게 적용됩니다 SetWindowLong. *Ptr32 비트 64 비트 버전의 Windows와 호환되는 코드를 작성 하려면 이들 모두를 각각의 변형 으로 바꿔야합니다 .

또한, 당신의 모든 임무 cursor_name는 다소 어색합니다. non-const 에는 캐스트가 있어서는 안됩니다 LPSTR. 미리 정의 된 커서 ID의 경우 간단한 할당이면 충분합니다 (예 : cursor_name = IDC_ARROW;. 사용자 정의 ID의 경우 MAKEINTRESOURCE.

실제로 커서를로드하는 코드도 잘못되었습니다 (32 비트 및 64 비트 빌드의 경우). 미리 정의 된 모양 ( IDC_ARROW) 또는 사용자 정의 ( IDCC_ELXMEN) 인 커서 리소스를로드하려고합니다 . 사전 정의 및 사용자 정의 커서에는 HINSTANCE결국에 전달되는 다른 매개 변수가 필요 합니다 LoadCursor. 게시 한 코드의 경우는 해당되지 않는 것 같습니다 (코드의 해당 부분을 생략했지만).

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

OSX에서 마우스 오버시 커서가 변경되지 않음

분류에서Dev

32 비트에서는 하이퍼 스레딩이지만 64 비트에서는 그렇지 않습니까?

분류에서Dev

32 비트에서는 하이퍼 스레딩이지만 64 비트에서는 그렇지 않습니까?

분류에서Dev

Wix : 64 비트 머신에서 32 비트 레지스터에 쓰는 방법

분류에서Dev

서비스 변수가 하위 구성 요소에서 변경되는 동안 상위 구성 요소에서 업데이트되지 않음

분류에서Dev

32 비트 응용 프로그램이 64 비트에서 제대로 설치되지 않음

분류에서Dev

64 비트 Windows에서 32 비트 JVM 최대 메모리 크기가 예상만큼 크지 않음

분류에서Dev

64 비트 Windows에서 32 비트 JVM 최대 메모리 크기가 예상만큼 크지 않음

분류에서Dev

마우스 다운 및 드래그시 커서가 변경되지 않음 (IE11)

분류에서Dev

React Native에서 텍스트 색상이 변경되지 않음

분류에서Dev

html에서 텍스트 색상이 변경되지 않음

분류에서Dev

64 비트 eclipse rcp 제품은 64 비트 OS + 32 비트 컴파일 및 번들 JDK 1.7 32 비트 키트에서 실행되지 않습니다.

분류에서Dev

브라우저에서 이미지가 변경되지 않음

분류에서Dev

브라우저에서 이미지가 변경되지 않음

분류에서Dev

TextView 텍스트가 변경되었지만 표시되지 않음

분류에서Dev

VBA API 레지스트리에서 값 읽기 32 비트 및 64 비트

분류에서Dev

Virtualbox가 64 비트 컴퓨터에서 32 비트 옵션 만 표시하고 32 비트 OS가 작동하지 않는 이유

분류에서Dev

Kendo 테마는 차트에서 변경되지 않습니다.

분류에서Dev

Python 32 비트를 64 비트로 변경 한 후 Jupyter Notebook / Lab이 시작되지 않음

분류에서Dev

어떤 테마를 사용하더라도 기본 마우스 커서가 변경되지 않습니다.

분류에서Dev

32 비트 시스템에서 64 비트 변수 산술 연산의 동작

분류에서Dev

32 비트 시스템에서 64 비트 패키지 다운로드

분류에서Dev

ArrayAdapter가 변경되었지만 UI에 반영되지 않음

분류에서Dev

64 비트 시스템에서 32 비트 initramfs 만들기

분류에서Dev

32 비트 OleAut 호출을 VBA에서 64 비트로 변환

분류에서Dev

C 코드 32 비트에서 64 비트 유형 변환

분류에서Dev

Excel MAcro를 32 비트에서 64 비트로 변환

분류에서Dev

자바 스크립트에서 HTML <p> 태그가 변경되지 않음

분류에서Dev

이 코드는 armv7 (32 비트)에서는 완벽하게 작동하지만 arm64 (64 비트)에서는 작동하지 않습니다.

Related 관련 기사

  1. 1

    OSX에서 마우스 오버시 커서가 변경되지 않음

  2. 2

    32 비트에서는 하이퍼 스레딩이지만 64 비트에서는 그렇지 않습니까?

  3. 3

    32 비트에서는 하이퍼 스레딩이지만 64 비트에서는 그렇지 않습니까?

  4. 4

    Wix : 64 비트 머신에서 32 비트 레지스터에 쓰는 방법

  5. 5

    서비스 변수가 하위 구성 요소에서 변경되는 동안 상위 구성 요소에서 업데이트되지 않음

  6. 6

    32 비트 응용 프로그램이 64 비트에서 제대로 설치되지 않음

  7. 7

    64 비트 Windows에서 32 비트 JVM 최대 메모리 크기가 예상만큼 크지 않음

  8. 8

    64 비트 Windows에서 32 비트 JVM 최대 메모리 크기가 예상만큼 크지 않음

  9. 9

    마우스 다운 및 드래그시 커서가 변경되지 않음 (IE11)

  10. 10

    React Native에서 텍스트 색상이 변경되지 않음

  11. 11

    html에서 텍스트 색상이 변경되지 않음

  12. 12

    64 비트 eclipse rcp 제품은 64 비트 OS + 32 비트 컴파일 및 번들 JDK 1.7 32 비트 키트에서 실행되지 않습니다.

  13. 13

    브라우저에서 이미지가 변경되지 않음

  14. 14

    브라우저에서 이미지가 변경되지 않음

  15. 15

    TextView 텍스트가 변경되었지만 표시되지 않음

  16. 16

    VBA API 레지스트리에서 값 읽기 32 비트 및 64 비트

  17. 17

    Virtualbox가 64 비트 컴퓨터에서 32 비트 옵션 만 표시하고 32 비트 OS가 작동하지 않는 이유

  18. 18

    Kendo 테마는 차트에서 변경되지 않습니다.

  19. 19

    Python 32 비트를 64 비트로 변경 한 후 Jupyter Notebook / Lab이 시작되지 않음

  20. 20

    어떤 테마를 사용하더라도 기본 마우스 커서가 변경되지 않습니다.

  21. 21

    32 비트 시스템에서 64 비트 변수 산술 연산의 동작

  22. 22

    32 비트 시스템에서 64 비트 패키지 다운로드

  23. 23

    ArrayAdapter가 변경되었지만 UI에 반영되지 않음

  24. 24

    64 비트 시스템에서 32 비트 initramfs 만들기

  25. 25

    32 비트 OleAut 호출을 VBA에서 64 비트로 변환

  26. 26

    C 코드 32 비트에서 64 비트 유형 변환

  27. 27

    Excel MAcro를 32 비트에서 64 비트로 변환

  28. 28

    자바 스크립트에서 HTML <p> 태그가 변경되지 않음

  29. 29

    이 코드는 armv7 (32 비트)에서는 완벽하게 작동하지만 arm64 (64 비트)에서는 작동하지 않습니다.

뜨겁다태그

보관