• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            coreBugZJ

            此 blog 已棄。

            將游戲手柄操作映射為鼠標(biāo)操作

            /*
            JoyToMouse.c

            Copyright (C) 2011, coreBugZJ, all rights reserved.

            版本:
            1.0.0

            功能:
            將游戲手柄操作映射為鼠標(biāo)操作。

            原理:
            接收手柄消息,然后產(chǎn)生相應(yīng)鼠標(biāo)消息。

            使用:
            方向鍵移動(dòng)(會(huì)自動(dòng)加速);
            鍵 1 <==> 左鍵;
            鍵 2 <==> 右鍵;

            鍵 3 <==> 調(diào)整靈敏度,增加;
            鍵 4 <==> 調(diào)整靈敏度,減小。

            */


            #include <Windows.h>
            #include <MMSystem.h>


            #pragma comment( lib, "winmm.lib" )


                    /* 每 ELAPSE 毫秒檢測(cè)手柄輸入 */
            #define  ELAPSE    17

                    /* 速度     mickeys / ELAPSE */
            INT  BASE_VX = 4;
            INT  BASE_VY = 4;
                    /* 加速度   mickeys / ELAPSE / ELAPSE */
            INT  ACCEL_VX   = 8;
            INT  ACCEL_VY   = 8;
                    /* 加加速度 mickeys / ELAPSE / ELAPSE / ELAPSE */
            #define  ACCEL_ACCEL_VX    1
            #define  ACCEL_ACCEL_VY    1
                    /* 方向標(biāo)志 */
            #define  MASK_LEFT      ((DWORD)1)
            #define  MASK_RIGHT     ((DWORD)2)
            #define  MASK_UP        ((DWORD)4)
            #define  MASK_DOWN      ((DWORD)8)


            TCHAR gClassName[] = TEXT("JoyToMouse");
            TCHAR gWndName[]   = TEXT("JoyToMouse -- coreBugZJ");


            VOID msgOut( HWND hWnd, TCHAR msg[], UINT msglen ) {
                    HDC hdc = GetDC( hWnd );
                    TextOut( hdc, 50, 20, msg, msglen );
                    ReleaseDC( hWnd, hdc );

                    /* MessageBox( NULL, msg, msg, MB_OK ); */
            }


            LRESULT CALLBACK WndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) {
                    static JOYINFO  ji1;
                    static DWORD    id1 = 0xFFFF;
                    static JOYCAPS  jc1;
                    static DWORD    numDev;
                    static DWORD    jxm1, jxl1, jxr1, jym1, jyt1, jyb1, x1, y1;
                    static DWORD    dirMask = 0;
                    static INT      vx = 0, vy = 0;

                    INT      dx, dy;
                    DWORD    bf;

                    switch ( uMsg ) {
                    case WM_CREATE :
                            SetTimer( hWnd, 1, ELAPSE, NULL );

                            if ( 0 == (numDev = joyGetNumDevs()) ) {
                                    MessageBox( hWnd, TEXT("0 == joyGetNumDevs()\n\n請(qǐng)檢查手柄是否插好"), TEXT("Error"), MB_OK | MB_ICONERROR );
                                    SendMessage( hWnd, WM_DESTROY, 0, 0 );
                                    return 0;
                            }

                            // 手柄 1
                            if ( JOYERR_NOERROR != joyGetPos( JOYSTICKID1, &ji1 ) ) {
                                    MessageBox( hWnd, TEXT("JOYERR_NOERROR != joyGetPos()\n\n請(qǐng)檢查手柄是否插好"), TEXT("Error"), MB_OK | MB_ICONERROR );
                                    SendMessage( hWnd, WM_DESTROY, 0, 0 );
                                    return 0;
                            }
                            if ( JOYERR_NOERROR != joyGetDevCaps( JOYSTICKID1, &jc1, sizeof(jc1) ) ) {
                                    MessageBox( hWnd, TEXT("JOYERR_NOERROR != joyGetDevCaps()\n\n請(qǐng)檢查手柄是否插好"), TEXT("Error"), MB_OK | MB_ICONERROR );
                                    SendMessage( hWnd, WM_DESTROY, 0, 0 );
                                    return 0;
                            }
                            id1  = JOYSTICKID1;
                            jxm1 = ( jc1.wXmin + jc1.wXmax ) / 2;
                            jxl1 = ( jc1.wXmin + jxm1 ) / 2;
                            jxr1 = ( jc1.wXmax + jxm1 ) / 2;
                            jym1 = ( jc1.wYmin + jc1.wYmax ) / 2;
                            jyt1 = ( jc1.wYmin + jym1 ) / 2;
                            jyb1 = ( jc1.wYmax + jym1 ) / 2;
                            x1   = jxm1;
                            y1   = jym1;
                            joySetCapture( hWnd, id1, ELAPSE, TRUE );
                            return 0;

                    case WM_TIMER :
                            if ( 0 == dirMask ) {
                                    return 0;
                            }

                            dx = dy = 0;
                            if ( dirMask & MASK_LEFT ) {
                                    vx += ACCEL_VX;
                                    dx  = -vx;
                            }
                            if ( dirMask & MASK_RIGHT ) {
                                    vx += ACCEL_VX;
                                    dx  = vx;
                            }
                            if ( dirMask & MASK_UP ) {
                                    vy += ACCEL_VY;
                                    dy  = -vy;
                            }
                            if ( dirMask & MASK_DOWN ) {
                                    vy += ACCEL_VY;
                                    dy  = vy;
                            }

                            msgOut( hWnd, TEXT("MOVE         "), 12 );
                            mouse_event( MOUSEEVENTF_MOVE, dx, dy, 0, 0 );
                            return 0;

                    case MM_JOY1MOVE :
                            dirMask = 0;
                            x1 = LOWORD(lParam);
                            y1 = HIWORD(lParam);
                            if ( x1 < jxl1 ) {
                                    dirMask |= MASK_LEFT;
                                    vx = BASE_VX;
                                    msgOut( hWnd, TEXT("LEFT1 DOWN   "), 12 );
                            }
                            if ( x1 > jxr1 ) {
                                    dirMask |= MASK_RIGHT;
                                    vx = BASE_VX;
                                    msgOut( hWnd, TEXT("RIGHT1 DOWN  "), 12 );
                            }
                            if ( y1 < jyt1 ) {
                                    dirMask |= MASK_UP;
                                    vy = BASE_VY;
                                    msgOut( hWnd, TEXT("UP1 DOWN     "), 12 );
                            }
                            if ( y1 > jyb1 ) {
                                    dirMask |= MASK_DOWN;
                                    vy = BASE_VY;
                                    msgOut( hWnd, TEXT("DOWN1 DOWN   "), 12 );
                            }
                            return 0;

                    case MM_JOY1BUTTONDOWN :
                            bf = wParam;
                            if ( (bf & JOY_BUTTON1CHG) && (bf & JOY_BUTTON1) ) {
                                    mouse_event( MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0 );
                                    msgOut( hWnd, TEXT("BTN11 DOWN   "), 12 );
                            }
                            if ( (bf & JOY_BUTTON2CHG) && (bf & JOY_BUTTON2) ) {
                                    mouse_event( MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0 );
                                    msgOut( hWnd, TEXT("BTN12 DOWN   "), 12 );
                            }
                            if ( (bf & JOY_BUTTON3CHG) && (bf & JOY_BUTTON3) ) {
                                    ACCEL_VX += ACCEL_ACCEL_VX;
                                    ACCEL_VY += ACCEL_ACCEL_VY;
                                    BASE_VX  += ACCEL_VX;
                                    BASE_VY  += ACCEL_VY;
                                    msgOut( hWnd, TEXT("BTN13 DOWN   "), 12 );
                            }
                            if ( (bf & JOY_BUTTON4CHG) && (bf & JOY_BUTTON4) ) {
                                    BASE_VX  -= ACCEL_VX;
                                    BASE_VY  -= ACCEL_VY;
                                    if ( BASE_VX < 1 ) {
                                            BASE_VX = 1;
                                    }
                                    if ( BASE_VY < 1 ) {
                                            BASE_VY = 1;
                                    }
                                    ACCEL_VX -= ACCEL_ACCEL_VX;
                                    ACCEL_VY -= ACCEL_ACCEL_VY;
                                    if ( ACCEL_VX < 0 ) {
                                            ACCEL_VX = 0;
                                    }
                                    if ( ACCEL_VY < 0 ) {
                                            ACCEL_VY = 0;
                                    }
                                    msgOut( hWnd, TEXT("BTN14 DWON   "), 12 );
                            }
                            return 0;

                    case MM_JOY1BUTTONUP :
                            bf = wParam;
                            if ( (bf & JOY_BUTTON1CHG) && (0 == (bf & JOY_BUTTON1)) ) {
                                    mouse_event( MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 );
                                    msgOut( hWnd, TEXT("BTN11 UP     "), 12 );
                            }
                            if ( (bf & JOY_BUTTON2CHG) && (0 == (bf & JOY_BUTTON2)) ) {
                                    mouse_event( MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0 );
                                    msgOut( hWnd, TEXT("BTN12 UP     "), 12 );
                            }
                            if ( (bf & JOY_BUTTON3CHG) && (0 == (bf & JOY_BUTTON3)) ) {
                                    msgOut( hWnd, TEXT("BTN13 UP    "), 12 );
                            }
                            if ( (bf & JOY_BUTTON4CHG) && (0 == (bf & JOY_BUTTON4)) ) {
                                    msgOut( hWnd, TEXT("BTN14 UP     "), 12 );
                            }
                            return 0;

                    case WM_DESTROY :
                            KillTimer( hWnd, 1 );
                            if ( JOYSTICKID1 == id1 ) {
                                    joyReleaseCapture( id1 );
                            }
                            PostQuitMessage( 0 );
                            return 0;
                    }

                    return DefWindowProc( hWnd, uMsg, wParam, lParam );
            }


            INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR cmd, INT nShow ) {
                    WNDCLASSEX  wc;
                    HWND        hWnd;
                    MSG         msg;

                    wc.cbClsExtra    = 0;
                    wc.cbSize        = sizeof(wc);
                    wc.cbWndExtra    = 0;
                    wc.hbrBackground = (HBRUSH)GetStockObject( WHITE_BRUSH );
                    wc.hCursor       = LoadCursor( NULL, IDC_ARROW );
                    wc.hIcon         = LoadIcon( NULL, IDI_APPLICATION );
                    wc.hIconSm       = LoadIcon( NULL, IDI_APPLICATION );
                    wc.hInstance     = hInst;
                    wc.lpfnWndProc   = WndProc;
                    wc.lpszClassName = gClassName;
                    wc.lpszMenuName  = NULL;
                    wc.style         = 0;

                    if ( 0 == RegisterClassEx( &wc ) ) {
                            MessageBox( NULL, TEXT("RegisterClassEx Failed!"), TEXT("Error"), MB_OK | MB_ICONERROR );
                            return 0;
                    }

                    hWnd = CreateWindowEx( 0,
                            gClassName, gWndName,
                            WS_OVERLAPPEDWINDOW,
                            200, 200, 400, 100,
                            NULL, NULL,
                            hInst, NULL );
                    if ( NULL == hWnd ) {
                            MessageBox( NULL, TEXT("CreateWindowEx Failed!"), TEXT("Error"), MB_OK | MB_ICONERROR );
                            return 0;
                    }
                    ShowWindow( hWnd, nShow );
                    UpdateWindow( hWnd );

                    while ( GetMessage( &msg, NULL, 0, 0 ) ) {
                            TranslateMessage( &msg );
                            DispatchMessage( &msg );
                    }
                    return msg.wParam;
            }

            posted on 2011-12-31 16:41 coreBugZJ 閱讀(2301) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 娛樂(lè)

            久久亚洲精品国产精品婷婷 | 国产精品无码久久久久久| 2019久久久高清456| 无码人妻精品一区二区三区久久| 精品国产乱码久久久久久郑州公司 | 97精品伊人久久久大香线蕉| 国产成人久久777777| 国内精品久久国产| 久久精品aⅴ无码中文字字幕重口| 欧美伊香蕉久久综合类网站| 久久伊人五月天论坛| 国产精品久久久久久福利漫画| 伊人 久久 精品| 99久久精品免费看国产一区二区三区 | 亚洲色婷婷综合久久| 国产午夜精品久久久久九九电影| 久久99热这里只有精品国产| 久久精品国内一区二区三区| 99久久国产亚洲综合精品| 亚洲一本综合久久| 亚洲国产精品无码久久SM| 久久无码精品一区二区三区| 久久99国产精品99久久| 久久久久高潮毛片免费全部播放| 人妻中文久久久久| 国产精品成人久久久久三级午夜电影| 国产色综合久久无码有码| 九九久久精品国产| 97精品国产97久久久久久免费| 精品国产乱码久久久久久郑州公司 | 色偷偷888欧美精品久久久| 人妻无码αv中文字幕久久| 久久无码高潮喷水| 中文国产成人精品久久不卡| 国产精品久久久久久五月尺| 国内精品久久久久影院老司| 国产69精品久久久久9999APGF| 久久天天躁狠狠躁夜夜躁2014| 久久久久久久精品成人热色戒| 热久久最新网站获取| 综合久久国产九一剧情麻豆|