• <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 已棄。

            JoyToKey 游戲手柄輸入映射為鍵盤輸入


            本想用游戲手柄玩模擬器游戲的,可惜

            游戲手柄在本機上可以使用,然而在虛擬機中無法使用(本機為Win7,手柄為北通戰戟,虛擬機為VirtualBox4.0.12),

            而我的模擬器游戲都裝在虛擬的WinXP中,因為我不放心這些模擬器呀。

            于是:
              1/*
              2JoyToKey.cpp
              3
              4Copyright (C) 2011, coreBugZJ, all rights reserved.
              5
              6功能:
              7將游戲手柄操作映射為鍵盤按鍵操作。
              8
              9原理:
             10接收手柄消息,然后產生相應鍵盤消息。
             11
             12上 W
             13下 S
             14左 A
             15右 D
             16
             171  U
             182  I
             193  J
             204  K
             21
             22*/

             23
             24
             25#include <Windows.h>
             26#include <MMSystem.h>
             27
             28
             29#pragma comment( lib, "winmm.lib" )
             30
             31
             32TCHAR gClassName[] = TEXT("JoyToKey");
             33TCHAR gWndName[]   = TEXT("JoyToKey -- coreBugZJ");
             34
             35
             36#define  ID_TIMER  1
             37#define  ELAPSE    50
             38
             39
             40VOID errorOut( HWND hWnd, TCHAR msg[], UINT msglen ) {
             41        HDC hdc = ::GetDC( hWnd );
             42        ::TextOut( hdc, 5050, msg, msglen );
             43        ::ReleaseDC( hWnd, hdc );
             44}

             45
             46#define  MAKEKEY(k)  do { \
             47                ::keybd_event( k, MapVirtualKey(k,0), 00 ); \
             48                ::Sleep( 50 ); \
             49                ::keybd_event( k, MapVirtualKey(k,0), KEYEVENTF_KEYUP, 0 ); \
             50        } while ( 0 )
             51
             52LRESULT CALLBACK WndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) {
             53        static JOYINFO ji;
             54        static UINT    id = 0xFFFF;
             55        static JOYCAPS jc;
             56        static INT jxl, jxr, jyt, jyb, jxm, jym;
             57
             58        switch ( uMsg ) {
             59        case WM_CREATE : 
             60                if ( 0 == ::joyGetNumDevs() ) {
             61                        ::MessageBox( hWnd, TEXT("0 == ::joyGetNumDevs()\n\n請檢查手柄是否插好"), TEXT("Error"), MB_OK | MB_ICONERROR );
             62                        ::SendMessage( hWnd, WM_DESTROY, 00 );
             63                        return 0;
             64                }

             65
             66                if ( JOYERR_UNPLUGGED == ::joyGetPos( JOYSTICKID1, &ji ) ) {
             67                        ::MessageBox( hWnd, TEXT("JOYERR_UNPLUGGED == ::joyGetPos()\n\n請檢查手柄是否插好"), TEXT("Error"), MB_OK | MB_ICONERROR );
             68                        ::SendMessage( hWnd, WM_DESTROY, 00 );
             69                        return 0;
             70                }

             71
             72                if ( JOYERR_NOERROR != ::joyGetDevCaps( JOYSTICKID1, &jc, sizeof(jc) ) ) {
             73                        ::MessageBox( hWnd, TEXT("JOYERR_NOERROR != ::joyGetDevCaps()\n\n請檢查手柄是否插好"), TEXT("Error"), MB_OK | MB_ICONERROR );
             74                        ::SendMessage( hWnd, WM_DESTROY, 00 );
             75                        return 0;
             76                }

             77
             78                id = JOYSTICKID1;
             79
             80                jxm = ( jc.wXmin + jc.wXmax ) / 2;
             81                jxl = ( jc.wXmin + jxm ) / 2;
             82                jxr = ( jc.wXmax + jxm ) / 2;
             83
             84                jym = ( jc.wYmin + jc.wYmax ) / 2;
             85                jyt = ( jc.wYmin + jym ) / 2;
             86                jyb = ( jc.wYmax + jym ) / 2;
             87
             88                ::joySetCapture( hWnd, id, 0, FALSE );
             89
             90                ::SetTimer( hWnd, ID_TIMER, ELAPSE, NULL );
             91
             92                return 0;
             93
             94        case WM_TIMER : 
             95                if ( JOYERR_NOERROR != ::joyGetPos( id, &ji ) ) {
             96                        return 0;
             97                }

             98                if ( ji.wXpos < jxl ) {
             99                        // 左
            100                        MAKEKEY('A');
            101                        errorOut( hWnd, TEXT("left         "), 12 );
            102                }

            103                if ( ji.wXpos > jxr ) {
            104                        // 右
            105                        MAKEKEY('D');
            106                        errorOut( hWnd, TEXT("right        "), 12 );
            107                }

            108                if ( ji.wYpos < jyt ) {
            109                        // 上
            110                        MAKEKEY('W');
            111                        errorOut( hWnd, TEXT("top          "), 12 );
            112                }

            113                if ( ji.wYpos > jyb ) {
            114                        // 下
            115                        MAKEKEY('S');
            116                        errorOut( hWnd, TEXT("down         "), 12 );
            117                }

            118                if ( ji.wButtons & JOY_BUTTON1 ) {
            119                        // 1
            120                        MAKEKEY('U');
            121                        errorOut( hWnd, TEXT("1            "), 12 );
            122                }

            123                if ( ji.wButtons & JOY_BUTTON2 ) {
            124                        // 2
            125                        MAKEKEY('I');
            126                        errorOut( hWnd, TEXT("2            "), 12 );
            127                }

            128                if ( ji.wButtons & JOY_BUTTON3 ) {
            129                        // 3
            130                        MAKEKEY('J');
            131                        errorOut( hWnd, TEXT("3            "), 12 );
            132                }

            133                if ( ji.wButtons & JOY_BUTTON4 ) {
            134                        // 4
            135                        MAKEKEY('K');
            136                        errorOut( hWnd, TEXT("4            "), 12 );
            137                }

            138                return 0;
            139
            140        case WM_DESTROY : 
            141                if ( JOYSTICKID1 == id ) {
            142                        ::KillTimer( hWnd, ID_TIMER );
            143                        ::joyReleaseCapture( id );
            144                }

            145                ::PostQuitMessage( 0 );
            146                return 0;
            147        }

            148
            149        return ::DefWindowProc( hWnd, uMsg, wParam, lParam );
            150}

            151
            152INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR cmd, INT nShow ) {
            153        WNDCLASSEX  wc;
            154        HWND        hWnd;
            155        MSG         msg;
            156
            157        wc.cbClsExtra    = 0;
            158        wc.cbSize        = sizeof(wc);
            159        wc.cbWndExtra    = 0;
            160        wc.hbrBackground = (HBRUSH)::GetStockObject( WHITE_BRUSH );
            161        wc.hCursor       = ::LoadCursor( NULL, IDC_ARROW );
            162        wc.hIcon         = ::LoadIcon( NULL, IDI_APPLICATION );
            163        wc.hIconSm       = ::LoadIcon( NULL, IDI_APPLICATION );
            164        wc.hInstance     = hInst;
            165        wc.lpfnWndProc   = WndProc;
            166        wc.lpszClassName = gClassName;
            167        wc.lpszMenuName  = NULL;
            168        wc.style         = 0;
            169
            170        if ( 0 == ::RegisterClassEx( &wc ) ) {
            171                ::MessageBox( NULL, TEXT("RegisterClassEx Failed!"), TEXT("Error"), MB_OK | MB_ICONERROR );
            172                return 0;
            173        }

            174
            175        hWnd = ::CreateWindowEx( 0
            176                gClassName, gWndName, 
            177                WS_OVERLAPPEDWINDOW, 
            178                200200400100
            179                NULL, NULL, 
            180                hInst, NULL );
            181        if ( NULL == hWnd ) {
            182                ::MessageBox( NULL, TEXT("CreateWindowEx Failed!"), TEXT("Error"), MB_OK | MB_ICONERROR );
            183                return 0;
            184        }

            185        ::ShowWindow( hWnd, nShow );
            186        ::UpdateWindow( hWnd );
            187
            188        while ( ::GetMessage( &msg, NULL, 00 ) ) {
            189                ::TranslateMessage( &msg );
            190                ::DispatchMessage( &msg );
            191        }

            192        return msg.wParam;
            193}

            194



            在我的宿主機上運行此軟件,然后在虛擬機上運行游戲且設置鍵盤操作的對應鍵位,因為對手柄操作將產生相應的鍵盤操作,所以就可以用手柄玩游戲了。

            小問題:由于手柄操作映射到鍵盤操作的方式,導致操作有一點點的變異。。。

            posted on 2011-10-03 23:32 coreBugZJ 閱讀(4372) 評論(4)  編輯 收藏 引用 所屬分類: Windows娛樂

            Feedback

            # re: JoyToKey 游戲手柄輸入映射為鍵盤輸入 2012-01-22 17:53 zuoyou123678

            你試沒試看能否運行在發到博客好不好   回復  更多評論   

            # re: JoyToKey 游戲手柄輸入映射為鍵盤輸入 2012-01-22 17:55 zuoyou123678

            win32 SDK編程 函數前面還需要加 ::操作符 又不是mfc  回復  更多評論   

            # re: JoyToKey 游戲手柄輸入映射為鍵盤輸入 2012-01-27 12:25 coreBugZJ

            ::操作符 是 C++ 的 域運算符,不是 MFC 的;加在函數前表示全局函數。  回復  更多評論   

            # re: JoyToKey 游戲手柄輸入映射為鍵盤輸入 2012-01-27 12:26 coreBugZJ

            我機器上運行正常。  回復  更多評論   


            精品久久久久久国产潘金莲| 久久精品这里只有精99品| 久久久老熟女一区二区三区| 国产精品久久久久久久| 国产AV影片久久久久久| 亚洲乱码日产精品a级毛片久久 | 久久精品国产亚洲AV无码麻豆| 久久97精品久久久久久久不卡| 久久99精品国产麻豆蜜芽| 久久亚洲中文字幕精品一区| 久久精品九九亚洲精品| 久久久久久亚洲精品不卡| 成人午夜精品无码区久久| 久久久久国产精品| 久久这里的只有是精品23| 成人国内精品久久久久影院| 久久久WWW免费人成精品| 久久久亚洲欧洲日产国码二区 | 久久国产一片免费观看| 国产成人精品久久| 色综合久久久久网| 欧美一区二区三区久久综合| 精品久久久久久无码人妻蜜桃| 亚洲AV无码成人网站久久精品大| 国产伊人久久| 久久99国产乱子伦精品免费| 性做久久久久久久久| 久久久久久免费一区二区三区 | 久久亚洲精品成人无码网站| 久久精品国产91久久综合麻豆自制| 中文字幕精品久久| 久久99精品久久久久久9蜜桃| 色欲av伊人久久大香线蕉影院| 国内精品久久久久国产盗摄| 国产精品一区二区久久不卡| 久久亚洲AV无码精品色午夜麻豆 | 精品久久久久久99人妻| 99久久婷婷免费国产综合精品| 久久精品国产久精国产果冻传媒 | 91久久香蕉国产熟女线看| 久久永久免费人妻精品下载|