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

coreBugZJ

此 blog 已棄。

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

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

 22
 23
 24#include <Windows.h>
 25#include <MMSystem.h>
 26
 27
 28#pragma comment( lib, "winmm.lib" )
 29
 30
 31        // 每 ELAPSE 毫秒檢測(cè)手柄輸入
 32#define  ELAPSE    50
 33        // 手柄按鍵對(duì)應(yīng)鍵盤按鍵
 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請(qǐng)檢查手柄是否插好"), 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請(qǐng)檢查手柄是否插好"), 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請(qǐng)檢查手柄是否插好"), 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) 評(píng)論(1)  編輯 收藏 引用 所屬分類: Windows娛樂

Feedback

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

沒有寫包含wingdi.h。
其它正常
有價(jià)值的代碼,
謝謝  回復(fù)  更多評(píng)論   


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲视频一二区| 国产精品一区久久| 亚洲神马久久| 亚洲精品永久免费| 亚洲国产精品久久久久婷婷老年 | 中文日韩欧美| 亚洲一区二区三区在线看| 亚洲欧美国产高清| 欧美专区日韩专区| 欧美成人一区二区三区在线观看| 欧美成人一区二区| 亚洲精品看片| 99视频一区| 午夜欧美电影在线观看| 久久久久久高潮国产精品视| 欧美国产精品人人做人人爱| 国产精品区一区| 亚洲高清视频中文字幕| 亚洲网站视频福利| 久久精品在线播放| 亚洲精品孕妇| 久久综合给合久久狠狠色| 欧美三级午夜理伦三级中视频| 国产欧美一区二区三区久久人妖| 亚洲福利视频网站| 亚洲影院在线观看| 亚洲春色另类小说| 午夜在线一区| 欧美日韩精品免费观看视一区二区| 国产乱码精品一区二区三区忘忧草| 在线日韩欧美视频| 久久成人国产| 一区二区三区四区五区精品视频| 久久久精品999| 国产精品一区二区a| 在线亚洲伦理| 亚洲国产精品成人一区二区| 欧美一区二区网站| 国产精品狠色婷| 日韩午夜激情| 欧美国产91| 久久一日本道色综合久久| 国产精品久久婷婷六月丁香| 亚洲人体1000| 免费成人黄色av| 欧美中日韩免费视频| 国产精品视频久久久| 亚洲一二区在线| 91久久在线播放| 欧美+亚洲+精品+三区| 国产自产在线视频一区| 欧美亚洲综合另类| 在线亚洲欧美视频| 欧美午夜三级| 中文精品视频| 99日韩精品| 国产精品99一区二区| 亚洲天堂第二页| 一本色道久久综合亚洲二区三区| 亚洲精品免费电影| 欧美www在线| 最新精品在线| 亚洲国产精品一区二区www| 欧美69视频| 99国内精品久久| 亚洲精品视频在线观看网站 | 欧美成人一区二免费视频软件| 黑丝一区二区三区| 美日韩精品视频| 免费不卡中文字幕视频| 亚洲精品一区二区三区四区高清| 亚洲国产第一| 国产精品v日韩精品| 亚洲欧美日韩直播| 久久国产精品毛片| 91久久久亚洲精品| 亚洲黄色在线视频| 欧美日韩国产首页| 亚洲欧美日韩成人高清在线一区| 亚洲一区二区在线看| 国内免费精品永久在线视频| 欧美电影免费观看| 国产精品福利网| 久久婷婷久久| 欧美欧美全黄| 欧美在线短视频| 免费成人毛片| 亚洲欧美区自拍先锋| 久久久久国产精品午夜一区| 日韩视频在线播放| 性久久久久久| 日韩性生活视频| 亚洲综合成人婷婷小说| 在线日韩日本国产亚洲| 99re在线精品| 黄色精品一二区| 亚洲伦理网站| 国内外成人在线| 亚洲精品看片| 好男人免费精品视频| 99精品欧美一区二区蜜桃免费| 国产日本欧美视频| 91久久国产综合久久| 国产日韩欧美电影在线观看| 亚洲欧洲一区二区在线观看| 国产一区二区在线观看免费| 亚洲区在线播放| 经典三级久久| 亚洲一区二区三区欧美| 欲色影视综合吧| 亚洲欧美日韩国产中文在线| 99精品视频免费| 麻豆av福利av久久av| 久久久精品日韩欧美| 国产精品白丝jk黑袜喷水| 欧美激情在线| 在线播放日韩| 新片速递亚洲合集欧美合集| 亚洲欧美国产精品桃花| 欧美日韩精品一区二区| 亚洲国产经典视频| 亚洲电影专区| 亚洲高清毛片| 国产婷婷色一区二区三区四区| 亚洲精品乱码久久久久久蜜桃麻豆 | 欧美成在线观看| 久色成人在线| 国产女精品视频网站免费| 一区二区三区回区在观看免费视频| 亚洲国产一区二区a毛片| 欧美在线视频观看| 久久福利资源站| 国产欧美日韩另类一区| 亚洲自拍偷拍福利| 亚洲欧美日韩精品久久| 国产精品igao视频网网址不卡日韩| 亚洲福利视频三区| 亚洲三级影院| 欧美精品免费视频| 亚洲精品欧美专区| 一区二区黄色| 国产精品v一区二区三区| 宅男精品导航| 久久gogo国模啪啪人体图| 国产区精品视频| 久久精品国产91精品亚洲| 久久综合伊人77777尤物| 1204国产成人精品视频| 美女露胸一区二区三区| 亚洲国产一区二区三区高清| 99亚洲一区二区| 国产精品久久久久久久久借妻 | 国产亚洲成av人在线观看导航 | 日韩天天综合| 欧美日韩蜜桃| 在线综合+亚洲+欧美中文字幕| 亚洲欧美成人精品| 国产欧美日韩视频一区二区| 久久av老司机精品网站导航| 暖暖成人免费视频| 日韩午夜在线电影| 国产精品美女久久久浪潮软件 | 新狼窝色av性久久久久久| 国产欧美短视频| 久久最新视频| 夜夜嗨一区二区| 久久riav二区三区| 91久久午夜| 国产精品免费网站在线观看| 久久久噜噜噜久噜久久 | 亚洲国产成人精品久久久国产成人一区 | 免费在线国产精品| 亚洲伦理久久| 久久久久久久国产| 亚洲美女视频网| 国产欧美 在线欧美| 老妇喷水一区二区三区| 亚洲视频碰碰| 亚洲国产一区二区三区高清| 欧美尤物巨大精品爽| 亚洲精品在线免费观看视频| 国产精品有限公司| 欧美国产亚洲精品久久久8v| 午夜精品久久| 亚洲精品一区二区三区不| 久久国产毛片| 亚洲视频一起| 亚洲看片网站| 在线成人小视频| 国产日本欧美一区二区三区在线| 欧美激情精品久久久久久大尺度 | 亚洲区一区二区三区| 国产视频亚洲| 国产精品日韩在线观看| 欧美乱妇高清无乱码| 久久影视三级福利片| 欧美一区二视频| 亚洲一区区二区| 日韩视频一区| 亚洲精品日韩激情在线电影|