青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

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 閱讀(4414) 評論(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

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


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美主播一区二区三区| 亚洲毛片在线免费观看| 欧美影视一区| 亚洲人妖在线| 亚洲电影在线看| 久久综合中文字幕| 久久精品国产69国产精品亚洲| 一本大道久久精品懂色aⅴ| 亚洲激情黄色| 一本色道久久综合亚洲二区三区| 亚洲高清在线观看一区| 亚洲国产另类久久精品| 99pao成人国产永久免费视频| 韩日精品视频| 亚洲精品在线免费| 午夜亚洲福利在线老司机| 午夜老司机精品| 美女精品一区| 亚洲人成网站在线观看播放| 亚洲美女色禁图| 欧美在现视频| 欧美手机在线| 亚洲蜜桃精久久久久久久| 亚洲视频免费看| 美女啪啪无遮挡免费久久网站| 欧美国产91| 一区二区视频免费完整版观看| 亚洲精品一区二区在线观看| 亚洲欧美日韩精品久久奇米色影视 | 国产人妖伪娘一区91| 91久久久亚洲精品| 性亚洲最疯狂xxxx高清| 亚洲黄页一区| 久久蜜桃资源一区二区老牛| 国产精品丝袜xxxxxxx| 在线一区二区三区四区| 蜜臀99久久精品久久久久久软件 | 一区二区三区.www| 奶水喷射视频一区| 久久久久国产一区二区| 国产欧美va欧美va香蕉在| 亚洲天堂av在线免费观看| 91久久在线视频| 欧美三级电影大全| 欧美一区二区三区视频在线| 韩国女主播一区| 欧美不卡一区| 欧美成人亚洲成人| 亚洲永久在线| 久久精品30| 亚洲美女电影在线| 亚洲在线国产日韩欧美| 亚洲女同在线| 伊人婷婷欧美激情| 亚洲福利视频一区| 国产精品视频福利| 欧美激情亚洲国产| 国产日韩精品在线播放| 欧美成人高清| 国产精品久久久久影院色老大| 午夜国产欧美理论在线播放 | 欧美+亚洲+精品+三区| 免费亚洲一区二区| 欧美一区二区成人| 免费久久99精品国产自| 性欧美xxxx大乳国产app| 欧美精品情趣视频| 欧美成人精品三级在线观看| 国产精品一区二区女厕厕| 亚洲欧洲一区| 欲香欲色天天天综合和网| 亚洲一区免费网站| 亚洲影院高清在线| 国产精品久久久久久户外露出| 亚洲高清一区二| 亚洲人体影院| 欧美日韩国产成人在线观看| 欧美成人国产| 亚洲精品女av网站| 欧美激情视频网站| 亚洲激情网站| 亚洲综合成人在线| 国产午夜精品一区二区三区视频| 在线一区二区三区四区| 亚洲一区二区三区视频| 国产精品男人爽免费视频1| 亚洲午夜视频在线观看| 亚洲欧美成人精品| 亚洲精品久久久久久久久久久久久| 韩国福利一区| 亚洲无线视频| 国产精品影视天天线| 亚洲免费高清视频| 午夜精品一区二区三区在线| 国产精品日韩一区二区| 久久久久久九九九九| 亚洲欧美在线免费观看| 欧美福利电影网| 欧美一区二区三区四区在线| 精品成人在线观看| 欧美综合二区| 亚洲第一黄网| 国产美女精品一区二区三区| 久久亚洲精品一区| 欧美一区二区三区免费看| 亚洲大胆美女视频| 欧美在线看片a免费观看| a91a精品视频在线观看| 精品999在线播放| 国产精品萝li| 国产精品久久久久免费a∨大胸| 久久久久久久综合狠狠综合| 午夜影院日韩| 欧美伊人久久| 久久精品亚洲精品国产欧美kt∨| 亚洲一区二区三区欧美| 亚洲夜间福利| 亚洲欧美中文字幕| 午夜精品免费在线| 亚洲综合精品| 久久精品国产免费观看| 欧美影院久久久| 久久夜色精品| 欧美精品高清视频| 国产精品久久久久久久免费软件| 国产精品扒开腿爽爽爽视频| 欧美三级午夜理伦三级中文幕 | 亚洲一区二区三区乱码aⅴ| 一本大道久久a久久精品综合| 野花国产精品入口| 亚洲欧美日韩国产一区二区三区| 亚洲图片你懂的| 欧美一区二区视频在线| 久久影视精品| 国产精品国产三级国产普通话蜜臀| 国产精品视频一区二区高潮| 韩日精品中文字幕| 亚洲无限av看| 亚洲国产日韩欧美| 欧美在线观看日本一区| 欧美日韩专区在线| 在线免费日韩片| 久久成人精品无人区| 亚洲黄网站在线观看| 欧美一区二区精品久久911| 欧美电影电视剧在线观看| 国产亚洲人成网站在线观看| 亚洲视频axxx| 亚洲免费观看视频| 欧美**人妖| 亚洲精品一区在线| 欧美刺激午夜性久久久久久久| 亚洲自拍偷拍福利| 欧美午夜精品伦理| 亚洲视频在线免费观看| 91久久精品视频| 欧美黄色一区二区| 亚洲人成网站色ww在线| 老司机精品久久| 免费观看欧美在线视频的网站| 激情久久久久久久| 男女精品视频| 欧美电影美腿模特1979在线看| 亚洲国产精品成人精品| 亚洲福利小视频| 欧美日韩午夜在线视频| 亚洲免费视频一区二区| 欧美一级在线视频| 亚洲国产日韩一区| 亚洲激情视频在线观看| 亚洲国产精品成人综合| 欧美日韩成人一区| 久久激五月天综合精品| 欧美大色视频| 亚洲国产精品一区二区尤物区| 黄色成人av在线| 亚洲国产婷婷香蕉久久久久久99| 欧美精品 国产精品| 午夜精品999| 你懂的网址国产 欧美| 亚洲欧美在线免费| 欧美激情一区二区| 久久久久久综合| 欧美午夜一区二区| 亚洲国产精品一区在线观看不卡| 国产精品蜜臀在线观看| 91久久国产综合久久蜜月精品| 欧美肉体xxxx裸体137大胆| 葵司免费一区二区三区四区五区| 欧美午夜免费影院| 一区二区三区三区在线| 日韩视频一区二区三区在线播放| 亚洲欧美国产毛片在线| 香蕉视频成人在线观看| 国产精品国产三级国产专播品爱网 | 欧美激情国产精品| 精品成人在线观看| 麻豆久久婷婷| 亚洲第一区中文99精品| 亚洲高清不卡av|