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

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>
            午夜在线精品| 国产亚洲aⅴaaaaaa毛片| 欧美在线观看视频一区二区三区| 国产亚洲欧美色| 欧美日韩国产限制| 久久久久久久尹人综合网亚洲| 亚洲一区二区三区涩| 亚洲午夜精品国产| 欧美一区二区啪啪| 蜜臀av性久久久久蜜臀aⅴ| 免费观看不卡av| 欧美另类高清视频在线| 国产精品久久久久久久免费软件 | 欧美在线短视频| 久久综合中文| 欧美午夜在线| 国产一区美女| 99在线观看免费视频精品观看| 亚洲一区二区免费看| 久久岛国电影| 亚洲美女毛片| 久久精品首页| 欧美系列电影免费观看| 一区福利视频| 午夜精品久久久久久久99水蜜桃| 久久午夜精品一区二区| 亚洲作爱视频| 免费欧美视频| 国产色综合久久| 一区二区三区日韩欧美精品| 久久人人超碰| 亚洲午夜在线| 欧美日韩国产精品一区| 一区免费视频| 久久精品免费看| 99精品视频免费观看| 久久精品国产69国产精品亚洲| 免费成人网www| 亚洲色图制服丝袜| 欧美激情a∨在线视频播放| 国产乱码精品一区二区三| 亚洲精品欧洲精品| 米奇777在线欧美播放| 亚洲欧美激情精品一区二区| 欧美高清视频一区二区三区在线观看| 国产啪精品视频| 午夜精品久久久久久久久久久久| 亚洲国产精品一区二区久| 欧美自拍偷拍| 国产日韩欧美制服另类| 亚洲欧美精品中文字幕在线| 亚洲区国产区| 欧美激情1区2区3区| 亚洲精品视频在线观看网站| 欧美国产高潮xxxx1819| 久久久美女艺术照精彩视频福利播放| 国产欧美日韩亚洲精品| 午夜精品偷拍| 亚洲一区在线观看免费观看电影高清| 欧美日产一区二区三区在线观看 | 国产精品久久久久久久久搜平片| 亚洲精品孕妇| 91久久精品美女高潮| 久久中文字幕一区| 在线日本成人| 欧美顶级大胆免费视频| 久久精品国产视频| 一区二区三区中文在线观看| 噜噜噜久久亚洲精品国产品小说| 久久狠狠婷婷| 亚洲激情在线视频| 亚洲人成网站色ww在线| 欧美色综合天天久久综合精品| 一区二区三区国产在线| 日韩一级欧洲| 国产日本欧洲亚洲| 久久亚洲视频| 欧美激情第二页| 亚洲男女毛片无遮挡| 欧美亚洲免费电影| 在线观看三级视频欧美| 亚洲第一精品夜夜躁人人爽| 欧美理论在线播放| 欧美一级视频精品观看| 欧美一区观看| 亚洲精品免费看| 亚洲一区在线直播| 精品成人在线| 99精品欧美一区二区三区综合在线| 国产精品久久久久9999吃药| 久久久久久国产精品mv| 美乳少妇欧美精品| 亚洲无线视频| 久久精品一区二区三区不卡牛牛| 欧美激情视频给我| 亚洲一区精彩视频| 午夜免费在线观看精品视频| 韩国女主播一区| 日韩视频中文字幕| 国产一区二区三区久久久久久久久 | 亚洲黄一区二区三区| 日韩视频二区| 韩国福利一区| 在线一区二区日韩| 在线免费一区三区| 亚洲欧美另类在线观看| 亚洲国产成人在线| 亚洲桃花岛网站| 久久嫩草精品久久久精品一| av成人免费在线观看| 欧美一区二区三区免费看 | 国产精品爽爽爽| 欧美激情在线有限公司| 国产偷国产偷精品高清尤物| 亚洲精选一区| 亚洲精品国产精品国产自| 久久精品视频一| 欧美一级一区| 欧美日韩免费观看中文| 欧美国产精品一区| 激情视频一区二区三区| 亚洲欧美在线观看| 亚洲自拍偷拍一区| 欧美人交a欧美精品| 欧美激情一区二区三区全黄| 黄色日韩网站| 久久久蜜桃精品| 可以看av的网站久久看| 国产一区在线观看视频| 欧美一级片一区| 久久精品五月婷婷| 国产亚洲精品bt天堂精选| 亚洲午夜精品一区二区| 亚洲一区二区高清视频| 欧美日韩另类视频| 99在线精品视频| 亚洲午夜电影网| 欧美日韩国产影院| 亚洲精品在线视频观看| 99在线|亚洲一区二区| 欧美激情1区| 在线视频精品一区| 午夜精彩视频在线观看不卡 | 国产精品高清在线| 亚洲视频1区| 亚洲欧美日韩中文在线制服| 欧美无砖砖区免费| 亚洲资源在线观看| 久久99在线观看| 国产一区久久| 毛片一区二区三区| 欧美国产日产韩国视频| 亚洲国产综合91精品麻豆| 久久亚洲精品中文字幕冲田杏梨 | 在线欧美电影| 午夜精品久久久久影视| 亚洲一级电影| 久久久国际精品| 激情伊人五月天久久综合| 日韩一本二本av| 欧美午夜激情小视频| 亚洲国产成人精品女人久久久| 欧美精品播放| 欧美一区二视频| 好看的av在线不卡观看| 久久久久国色av免费看影院| 久久一区激情| 亚洲精选成人| 国产精品乱码一区二区三区| 午夜精品视频在线| 欧美暴力喷水在线| 一本色道久久88综合日韩精品| 欧美性猛交xxxx乱大交蜜桃| 欧美一区二视频| 亚洲精品国产拍免费91在线| 亚洲欧美一区二区激情| 一区二区三区无毛| 欧美日本不卡高清| 欧美在线短视频| 亚洲美女av网站| 老巨人导航500精品| 99国产精品久久久久久久成人热 | 欧美激情精品久久久久久黑人| 亚洲天堂成人在线观看| 伊人天天综合| 国产精品美女主播在线观看纯欲| 久久夜色精品一区| 亚洲欧美精品一区| 亚洲经典一区| 蜜臀久久久99精品久久久久久| 亚洲午夜免费视频| 91久久线看在观草草青青| 国产日本欧美一区二区| 欧美日韩在线观看一区二区三区| 久久久91精品| 午夜欧美精品久久久久久久| 亚洲美女色禁图| 亚洲人午夜精品免费| 男人天堂欧美日韩| 久久久久高清|