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

coreBugZJ

此 blog 已棄。

JoyToKey 2.0 用游戲手柄模擬鍵盤玩游戲

這是之前的 JoyToKey 的改進版,真正實用,我和 CY 兩人用手柄對拳皇97,比鍵盤更容易放出招來(游戲是在不支持手柄的虛擬機中運行的)。
  1/*
  2JoyToKey.cpp
  3
  4Copyright (C) 2011, coreBugZJ, all rights reserved.
  5
  6版本:
  72.0.0
  8
  9功能:
 10將游戲手柄操作映射為鍵盤按鍵操作。
 11
 12原理:
 13接收手柄消息,然后產(chǎn)生相應鍵盤消息。
 14
 15改進:
 161.改進了手柄與鍵盤按鍵按下與釋放的對應:手柄按鍵釋放后才產(chǎn)生鍵盤按鍵釋放消息,手柄按鍵按下后只產(chǎn)生鍵盤按鍵按下消息。
 172.增加雙手柄支持,可以同時使用兩個手柄。
 18
 19使用時不必考慮手柄按鍵和鍵盤按鍵的對應關系,就如直接使用手柄一般使用。
 20
 21*/

 22
 23
 24#include <Windows.h>
 25#include <MMSystem.h>
 26
 27
 28#pragma comment( lib, "winmm.lib" )
 29
 30
 31        // 每 ELAPSE 毫秒檢測手柄輸入
 32#define  ELAPSE    50
 33        // 手柄按鍵對應鍵盤按鍵
 34#define  UP1     ('W')
 35#define  DOWN1   ('S')
 36#define  LEFT1   ('A')
 37#define  RIGHT1  ('D')
 38#define  BTN11   ('U')
 39#define  BTN12   ('I')
 40#define  BTN13   ('J')
 41#define  BTN14   ('K')
 42
 43#define  UP2     ('Z')
 44#define  DOWN2   ('X')
 45#define  LEFT2   ('C')
 46#define  RIGHT2  ('V')
 47#define  BTN21   ('B')
 48#define  BTN22   ('N')
 49#define  BTN23   ('M')
 50#define  BTN24   ('F')
 51
 52
 53TCHAR gClassName[] = TEXT("JoyToKey");
 54TCHAR gWndName[]   = TEXT("JoyToKey -- coreBugZJ");
 55
 56
 57VOID msgOut( HWND hWnd, TCHAR msg[], UINT msglen ) {
 58        HDC hdc = ::GetDC( hWnd );
 59        ::TextOut( hdc, 5020, msg, msglen );
 60        ::ReleaseDC( hWnd, hdc );
 61}

 62
 63#define  KEYDOWN(k)  ::keybd_event( k, ::MapVirtualKey(k,0), 0, 0 )
 64#define  KEYUP(k)    ::keybd_event( k, ::MapVirtualKey(k,0), KEYEVENTF_KEYUP, 0 )
 65
 66LRESULT CALLBACK WndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) {
 67        static JOYINFO  ji1, ji2;
 68        static DWORD    id1 = 0xFFFF, id2 = 0xFFFF;
 69        static JOYCAPS  jc1, jc2;
 70        static DWORD    numDev;
 71        static DWORD    jxm1, jxl1, jxr1, jym1, jyt1, jyb1, x1, y1;
 72        static DWORD    jxm2, jxl2, jxr2, jym2, jyt2, jyb2, x2, y2;
 73
 74        DWORD    x, y;
 75        DWORD    bf;
 76
 77        switch ( uMsg ) {
 78        case WM_CREATE : 
 79                if ( 0 == (numDev = ::joyGetNumDevs()) ) {
 80                        ::MessageBox( hWnd, TEXT("0 == ::joyGetNumDevs()\n\n請檢查手柄是否插好"), TEXT("Error"), MB_OK | MB_ICONERROR );
 81                        ::SendMessage( hWnd, WM_DESTROY, 00 );
 82                        return 0;
 83                }

 84
 85                // 手柄 1 
 86                if ( JOYERR_NOERROR != ::joyGetPos( JOYSTICKID1, &ji1 ) ) {
 87                        ::MessageBox( hWnd, TEXT("JOYERR_NOERROR != ::joyGetPos()\n\n請檢查手柄是否插好"), TEXT("Error"), MB_OK | MB_ICONERROR );
 88                        ::SendMessage( hWnd, WM_DESTROY, 00 );
 89                        return 0;
 90                }

 91                if ( JOYERR_NOERROR != ::joyGetDevCaps( JOYSTICKID1, &jc1, sizeof(jc1) ) ) {
 92                        ::MessageBox( hWnd, TEXT("JOYERR_NOERROR != ::joyGetDevCaps()\n\n請檢查手柄是否插好"), TEXT("Error"), MB_OK | MB_ICONERROR );
 93                        ::SendMessage( hWnd, WM_DESTROY, 00 );
 94                        return 0;
 95                }

 96                id1  = JOYSTICKID1;
 97                jxm1 = ( jc1.wXmin + jc1.wXmax ) / 2;
 98                jxl1 = ( jc1.wXmin + jxm1 ) / 2;
 99                jxr1 = ( jc1.wXmax + jxm1 ) / 2;
100                jym1 = ( jc1.wYmin + jc1.wYmax ) / 2;
101                jyt1 = ( jc1.wYmin + jym1 ) / 2;
102                jyb1 = ( jc1.wYmax + jym1 ) / 2;
103                x1   = jxm1;
104                y1   = jym1;
105                ::joySetCapture( hWnd, id1, ELAPSE, TRUE );
106
107                // 手柄 2 
108                if ( 2 > numDev ) {
109                        return 0;
110                }

111                if ( JOYERR_NOERROR != ::joyGetPos( JOYSTICKID2, &ji2 ) ) {
112                        return 0;
113                }

114                if ( JOYERR_NOERROR != ::joyGetDevCaps( JOYSTICKID2, &jc2, sizeof(jc2) ) ) {
115                        return 0;
116                }

117                id2  = JOYSTICKID2;
118                jxm2 = ( jc2.wXmin + jc2.wXmax ) / 2;
119                jxl2 = ( jc2.wXmin + jxm2 ) / 2;
120                jxr2 = ( jc2.wXmax + jxm2 ) / 2;
121                jym2 = ( jc2.wYmin + jc2.wYmax ) / 2;
122                jyt2 = ( jc2.wYmin + jym2 ) / 2;
123                jyb2 = ( jc2.wYmax + jym2 ) / 2;
124                x2   = jxm2;
125                y2   = jym2;
126                ::joySetCapture( hWnd, id2, ELAPSE, TRUE );
127
128                return 0;
129
130        case MM_JOY1MOVE : 
131                bf = wParam;
132                x  = LOWORD(lParam);
133                y  = HIWORD(lParam);
134
135                if ( x1 < jxl1 ) {
136                        KEYUP(LEFT1);
137                        ::msgOut( hWnd, TEXT("LEFT1 UP     "), 12 );
138                }

139                if ( x1 > jxr1 ) {
140                        KEYUP(RIGHT1);
141                        ::msgOut( hWnd, TEXT("RIGHT1 UP    "), 12 );
142                }

143                if ( y1 < jyt1 ) {
144                        KEYUP(UP1);
145                        ::msgOut( hWnd, TEXT("UP1 UP       "), 12 );
146                }

147                if ( y1 > jyb1 ) {
148                        KEYUP(DOWN1);
149                        ::msgOut( hWnd, TEXT("DOWN1 UP     "), 12 );
150                }

151
152                x1 = x;
153                y1 = y;
154                if ( x1 < jxl1 ) {
155                        KEYDOWN(LEFT1);
156                        ::msgOut( hWnd, TEXT("LEFT1 DOWN   "), 12 );
157                }

158                if ( x1 > jxr1 ) {
159                        KEYDOWN(RIGHT1);
160                        ::msgOut( hWnd, TEXT("RIGHT1 DOWN  "), 12 );
161                }

162                if ( y1 < jyt1 ) {
163                        KEYDOWN(UP1);
164                        ::msgOut( hWnd, TEXT("UP1 DOWN     "), 12 );
165                }

166                if ( y1 > jyb1 ) {
167                        KEYDOWN(DOWN1);
168                        ::msgOut( hWnd, TEXT("DOWN1 DOWN   "), 12 );
169                }

170                return 0;
171
172        case MM_JOY1BUTTONDOWN : 
173                bf = wParam;
174                if ( (bf & JOY_BUTTON1CHG) && (bf & JOY_BUTTON1) ) {
175                        KEYDOWN(BTN11);
176                        ::msgOut( hWnd, TEXT("BTN11 DOWN   "), 12 );
177                }

178                if ( (bf & JOY_BUTTON2CHG) && (bf & JOY_BUTTON2) ) {
179                        KEYDOWN(BTN12);
180                        ::msgOut( hWnd, TEXT("BTN12 DOWN   "), 12 );
181                }

182                if ( (bf & JOY_BUTTON3CHG) && (bf & JOY_BUTTON3) ) {
183                        KEYDOWN(BTN13);
184                        ::msgOut( hWnd, TEXT("BTN13 DOWN   "), 12 );
185                }

186                if ( (bf & JOY_BUTTON4CHG) && (bf & JOY_BUTTON4) ) {
187                        KEYDOWN(BTN14);
188                        ::msgOut( hWnd, TEXT("BTN14 DWON   "), 12 );
189                }

190                return 0;
191
192        case MM_JOY1BUTTONUP : 
193                bf = wParam;
194                if ( (bf & JOY_BUTTON1CHG) && (0 == (bf & JOY_BUTTON1)) ) {
195                        KEYUP(BTN11);
196                        ::msgOut( hWnd, TEXT("BTN11 UP     "), 12 );
197                }

198                if ( (bf & JOY_BUTTON2CHG) && (0 == (bf & JOY_BUTTON2)) ) {
199                        KEYUP(BTN12);
200                        ::msgOut( hWnd, TEXT("BTN12 UP     "), 12 );
201                }

202                if ( (bf & JOY_BUTTON3CHG) && (0 == (bf & JOY_BUTTON3)) ) {
203                        KEYUP(BTN13);
204                        ::msgOut( hWnd, TEXT("BTN13 UP    "), 12 );
205                }

206                if ( (bf & JOY_BUTTON4CHG) && (0 == (bf & JOY_BUTTON4)) ) {
207                        KEYUP(BTN14);
208                        ::msgOut( hWnd, TEXT("BTN14 UP     "), 12 );
209                }

210                return 0;
211
212        case MM_JOY2MOVE : 
213                bf = wParam;
214                x  = LOWORD(lParam);
215                y  = HIWORD(lParam);
216
217                if ( x2 < jxl2 ) {
218                        KEYUP(LEFT2);
219                        ::msgOut( hWnd, TEXT("LEFT2 UP     "), 12 );
220                }

221                if ( x2 > jxr2 ) {
222                        KEYUP(RIGHT2);
223                        ::msgOut( hWnd, TEXT("RIGHT2 UP    "), 12 );
224                }

225                if ( y2 < jyt2 ) {
226                        KEYUP(UP2);
227                        ::msgOut( hWnd, TEXT("UP2 UP       "), 12 );
228                }

229                if ( y2 > jyb2 ) {
230                        KEYUP(DOWN2);
231                        ::msgOut( hWnd, TEXT("DOWN2 UP     "), 12 );
232                }

233
234                x2 = x;
235                y2 = y;
236                if ( x2 < jxl2 ) {
237                        KEYDOWN(LEFT2);
238                        ::msgOut( hWnd, TEXT("LEFT2 DOWN   "), 12 );
239                }

240                if ( x2 > jxr2 ) {
241                        KEYDOWN(RIGHT2);
242                        ::msgOut( hWnd, TEXT("RIGHT2 DOWN  "), 12 );
243                }

244                if ( y2 < jyt2 ) {
245                        KEYDOWN(UP2);
246                        ::msgOut( hWnd, TEXT("UP2 DOWN     "), 12 );
247                }

248                if ( y2 > jyb2 ) {
249                        KEYDOWN(DOWN2);
250                        ::msgOut( hWnd, TEXT("DOWN2 DOWN   "), 12 );
251                }

252                return 0;
253
254        case MM_JOY2BUTTONDOWN : 
255                bf = wParam;
256                if ( (bf & JOY_BUTTON1CHG) && (bf & JOY_BUTTON1) ) {
257                        KEYDOWN(BTN21);
258                        ::msgOut( hWnd, TEXT("BTN21 DOWN   "), 12 );
259                }

260                if ( (bf & JOY_BUTTON2CHG) && (bf & JOY_BUTTON2) ) {
261                        KEYDOWN(BTN22);
262                        ::msgOut( hWnd, TEXT("BTN22 DOWN   "), 12 );
263                }

264                if ( (bf & JOY_BUTTON3CHG) && (bf & JOY_BUTTON3) ) {
265                        KEYDOWN(BTN23);
266                        ::msgOut( hWnd, TEXT("BTN23 DOWN   "), 12 );
267                }

268                if ( (bf & JOY_BUTTON4CHG) && (bf & JOY_BUTTON4) ) {
269                        KEYDOWN(BTN24);
270                        ::msgOut( hWnd, TEXT("BTN24 DWON   "), 12 );
271                }

272                return 0;
273
274        case MM_JOY2BUTTONUP : 
275                bf = wParam;
276                if ( (bf & JOY_BUTTON1CHG) && (0 == (bf & JOY_BUTTON1)) ) {
277                        KEYUP(BTN21);
278                        ::msgOut( hWnd, TEXT("BTN21 UP     "), 12 );
279                }

280                if ( (bf & JOY_BUTTON2CHG) && (0 == (bf & JOY_BUTTON2)) ) {
281                        KEYUP(BTN22);
282                        ::msgOut( hWnd, TEXT("BTN22 UP     "), 12 );
283                }

284                if ( (bf & JOY_BUTTON3CHG) && (0 == (bf & JOY_BUTTON3)) ) {
285                        KEYUP(BTN23);
286                        ::msgOut( hWnd, TEXT("BTN23 UP    "), 12 );
287                }

288                if ( (bf & JOY_BUTTON4CHG) && (0 == (bf & JOY_BUTTON4)) ) {
289                        KEYUP(BTN24);
290                        ::msgOut( hWnd, TEXT("BTN24 UP     "), 12 );
291                }

292                return 0;
293
294        case WM_DESTROY : 
295                if ( JOYSTICKID1 == id1 ) {
296                        ::joyReleaseCapture( id1 );
297                }

298                if ( JOYSTICKID2 == id2 ) {
299                        ::joyReleaseCapture( id2 );
300                }

301                ::PostQuitMessage( 0 );
302                return 0;
303        }

304
305        return ::DefWindowProc( hWnd, uMsg, wParam, lParam );
306}

307
308INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR cmd, INT nShow ) {
309        WNDCLASSEX  wc;
310        HWND        hWnd;
311        MSG         msg;
312
313        wc.cbClsExtra    = 0;
314        wc.cbSize        = sizeof(wc);
315        wc.cbWndExtra    = 0;
316        wc.hbrBackground = (HBRUSH)::GetStockObject( WHITE_BRUSH );
317        wc.hCursor       = ::LoadCursor( NULL, IDC_ARROW );
318        wc.hIcon         = ::LoadIcon( NULL, IDI_APPLICATION );
319        wc.hIconSm       = ::LoadIcon( NULL, IDI_APPLICATION );
320        wc.hInstance     = hInst;
321        wc.lpfnWndProc   = WndProc;
322        wc.lpszClassName = gClassName;
323        wc.lpszMenuName  = NULL;
324        wc.style         = 0;
325
326        if ( 0 == ::RegisterClassEx( &wc ) ) {
327                ::MessageBox( NULL, TEXT("RegisterClassEx Failed!"), TEXT("Error"), MB_OK | MB_ICONERROR );
328                return 0;
329        }

330
331        hWnd = ::CreateWindowEx( 0
332                gClassName, gWndName, 
333                WS_OVERLAPPEDWINDOW, 
334                200200400100
335                NULL, NULL, 
336                hInst, NULL );
337        if ( NULL == hWnd ) {
338                ::MessageBox( NULL, TEXT("CreateWindowEx Failed!"), TEXT("Error"), MB_OK | MB_ICONERROR );
339                return 0;
340        }

341        ::ShowWindow( hWnd, nShow );
342        ::UpdateWindow( hWnd );
343
344        while ( ::GetMessage( &msg, NULL, 00 ) ) {
345                ::TranslateMessage( &msg );
346                ::DispatchMessage( &msg );
347        }

348        return msg.wParam;
349}

350


posted on 2011-10-04 23:31 coreBugZJ 閱讀(2731) 評論(1)  編輯 收藏 引用 所屬分類: Windows娛樂

Feedback

# re: JoyToKey 2.0 用游戲手柄模擬鍵盤玩游戲 2012-03-03 01:24 General_Clarke

沒有寫包含wingdi.h。
其它正常
有價值的代碼,
謝謝  回復  更多評論   


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            中日韩视频在线观看| 欧美粗暴jizz性欧美20| 欧美日韩在线一区二区| 一区二区三区视频在线观看| 亚洲欧洲精品成人久久奇米网| 欧美中文日韩| 亚洲国产成人av在线| 亚洲国产日韩欧美在线图片| 欧美日韩亚洲一区二区| 亚洲一区二区三区午夜| 午夜精品在线| 亚洲欧洲一区二区三区久久| 亚洲精品一区中文| 国产欧美日韩91| 美女国内精品自产拍在线播放| 欧美成人福利视频| 亚洲一区二区三区三| 欧美自拍丝袜亚洲| 亚洲日韩第九十九页| 艳妇臀荡乳欲伦亚洲一区| 国产伦精品一区二区三区免费| 久久综合导航| 欧美人与性禽动交情品| 校园春色国产精品| 老司机免费视频一区二区| 亚洲一区二区在线观看视频| 欧美一区二区精品| 亚洲精品裸体| 午夜亚洲福利| 日韩亚洲欧美在线观看| 欧美一区二区三区四区在线 | 国产精品卡一卡二卡三| 久久亚洲欧美| 国产精品白丝av嫩草影院| 免费成人高清视频| 国产精品视频一二| 亚洲高清视频一区| 国产一区二区三区黄视频| 亚洲欧洲日本国产| 狠狠色综合网| 亚洲女性裸体视频| 一区二区三区久久| 免费h精品视频在线播放| 欧美一区二区三区视频在线观看| 欧美激情视频在线免费观看 欧美视频免费一 | 猛男gaygay欧美视频| 欧美一区二区视频观看视频| 欧美成人资源网| 蜜乳av另类精品一区二区| 国产精品乱子久久久久| 亚洲乱码国产乱码精品精98午夜| 国产尤物精品| 性xx色xx综合久久久xx| 亚洲一区二区精品| 欧美日韩午夜在线| 亚洲精品视频在线| 日韩一本二本av| 牛牛国产精品| 亚洲第一精品夜夜躁人人爽| 亚洲欧美激情一区二区| 亚洲无亚洲人成网站77777| 欧美激情视频给我| 亚洲国产精品久久91精品| 亚洲国产精品久久久久秋霞蜜臀| 久久久www成人免费精品| 久久婷婷av| 激情综合亚洲| 六月婷婷一区| 亚洲国产成人久久综合| 日韩午夜av| 欧美视频一区二区三区四区| 99视频精品在线| 亚洲欧美激情四射在线日| 国产精品久久久久免费a∨大胸| 一本色道久久88精品综合| 亚洲一区二区高清视频| 国产精品永久免费| 欧美在线一区二区| 欧美成人一区二区| 一区二区三区四区五区精品视频| 欧美日韩在线免费| 亚洲免费在线电影| 久久综合狠狠综合久久综青草| 亚洲福利国产精品| 欧美精品久久久久久久免费观看 | 国产精品v欧美精品v日本精品动漫| 一本到12不卡视频在线dvd| 亚洲欧美视频| 极品尤物av久久免费看| 欧美精品亚洲| 亚洲欧美国产77777| 免费成人你懂的| 一区二区三区精品国产| 国产欧美日韩一区| 欧美成人蜜桃| 亚洲女ⅴideoshd黑人| 欧美电影资源| 亚洲欧美日韩精品久久久| 国产综合av| 欧美欧美天天天天操| 亚洲女人天堂成人av在线| 亚洲福利一区| 性色av一区二区怡红| 亚洲激情在线| 国产午夜精品理论片a级大结局| 免费在线亚洲欧美| 亚洲特色特黄| 亚洲第一中文字幕| 久久精品一区二区| 一本一本久久a久久精品牛牛影视| 国产美女精品| 欧美日韩亚洲91| 免费观看成人www动漫视频| 亚洲一本大道在线| 亚洲黄色在线观看| 久久综合久久88| 性娇小13――14欧美| 一本大道久久精品懂色aⅴ | 国产精品美女主播在线观看纯欲| 免费亚洲一区| 久久久噜噜噜| 性高湖久久久久久久久| 一区二区三区国产盗摄| 亚洲国产精品综合| 久久综合激情| 开心色5月久久精品| 国产一区二区在线观看免费播放| 欧美日韩精品一区二区在线播放 | 国产精品一区二区欧美| 欧美日韩国产一区二区三区| 蜜桃av一区二区三区| 久久成人免费电影| 羞羞色国产精品| 亚洲永久精品大片| 亚洲视频视频在线| 99综合电影在线视频| 最新国产拍偷乱拍精品| 欧美黄色小视频| 欧美顶级大胆免费视频| 欧美1区免费| 欧美成人黑人xx视频免费观看 | 亚洲精品欧美极品| 亚洲精品国产精品国自产在线 | 国产精品美女在线| 国产精品亚洲美女av网站| 国产精品美女| 国产日韩一区二区三区在线播放 | 国产精品一区二区三区四区五区| 国产精品盗摄一区二区三区| 国产精品白丝av嫩草影院 | 欧美成人激情视频| 欧美精品一区二区三区四区| 欧美另类极品videosbest最新版本| 免费看成人av| 欧美日韩精品福利| 国产精品久久久| 国产乱码精品一区二区三区忘忧草| 国产精品久久久久久久久免费桃花 | 亚洲激情在线观看| 中文欧美在线视频| 午夜精品在线视频| 免费短视频成人日韩| 欧美日韩成人综合| 欧美午夜久久| 国产一区二区三区日韩欧美| 极品日韩久久| 一区二区免费在线视频| 亚洲综合欧美日韩| 久久久青草婷婷精品综合日韩| 欧美大片免费久久精品三p | 欧美精品一区二区三区蜜臀| 国产精品视频yy9099| 好吊日精品视频| 99re66热这里只有精品4| 亚洲欧美日韩国产另类专区| 久久综合九色欧美综合狠狠| 亚洲免费黄色| 欧美在线观看网站| 欧美日韩国产色站一区二区三区| 国产精品亚洲一区| 亚洲精品少妇30p| 欧美一区二区在线免费播放| 欧美黄色免费| 欧美一区二区视频在线| 欧美激情精品久久久久久久变态| 国产精品国产三级国产普通话99| 黄色日韩网站| 亚洲欧美日韩在线一区| 亚洲承认在线| 亚洲国产欧美一区二区三区丁香婷| 亚洲欧洲一区二区天堂久久| 久久免费一区| 亚洲作爱视频| 欧美暴力喷水在线| 国产日韩欧美综合| 99精品免费网| 欧美成人一区二区| 欧美在线综合视频| 国产精品一区二区三区四区 | 看欧美日韩国产|