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

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接收手柄消息,然后產生相應鍵盤消息。
 14
 15改進:
 161.改進了手柄與鍵盤按鍵按下與釋放的對應:手柄按鍵釋放后才產生鍵盤按鍵釋放消息,手柄按鍵按下后只產生鍵盤按鍵按下消息。
 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 閱讀(2739) 評論(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ⅴ在线发布| 日韩视频不卡中文| 国产尤物精品| 国产精品自在在线| 欧美人在线视频| 久久亚洲捆绑美女| 午夜日韩福利| 亚洲视频网在线直播| 最新国产成人av网站网址麻豆| 久久久久九九视频| 欧美亚洲免费在线| 亚洲在线视频一区| 亚洲视频1区| 日韩午夜av| 亚洲巨乳在线| 亚洲美女av网站| 91久久精品日日躁夜夜躁国产| 红桃视频国产精品| 国产欧美日本| 国产精品自拍在线| 国产精品视频精品| 国产精品日韩二区| 欧美视频二区| 欧美视频一区在线| 欧美性猛交视频| 欧美视频一区二| 国产精品初高中精品久久| 欧美日精品一区视频| 欧美精品一区在线观看| 欧美激情视频一区二区三区在线播放 | 这里只有精品视频在线| 亚洲区中文字幕| 亚洲经典视频在线观看| 亚洲黄色免费网站| 亚洲娇小video精品| 亚洲欧洲一区| 亚洲另类一区二区| 一区二区高清在线观看| 亚洲一区二区av电影| 亚洲无人区一区| 亚洲免费影视| 久久精品91久久香蕉加勒比| 久久福利视频导航| 另类天堂视频在线观看| 免费在线视频一区| 亚洲激情视频在线观看| 99精品欧美一区二区三区| 在线综合亚洲| 翔田千里一区二区| 久久久噜噜噜久久中文字免| 免费视频最近日韩| 欧美日韩亚洲一区三区| 国产精品三级视频| 狠狠综合久久| 日韩视频一区二区在线观看| 亚洲一区二区在线免费观看视频| 午夜在线a亚洲v天堂网2018| 久久久久综合| 亚洲国产欧美精品| 亚洲天堂av图片| 久久精品欧洲| 欧美日韩国产精品专区| 国产精品欧美日韩一区| 极品裸体白嫩激情啪啪国产精品| 亚洲人成网站777色婷婷| 亚洲少妇中出一区| 久久视频精品在线| 亚洲精品国久久99热| 亚洲欧美日韩天堂一区二区| 久久深夜福利免费观看| 欧美日韩国内自拍| 国产综合色在线| 99riav国产精品| 久久精品视频免费| 亚洲激情视频在线播放| 欧美一级久久| 欧美久久久久中文字幕| 国产区精品视频| 亚洲免费观看视频| 久久久久久久综合色一本| 亚洲日本理论电影| 久久精品国产成人| 欧美午夜大胆人体| 亚洲丶国产丶欧美一区二区三区| 国产精品99久久久久久久女警| 久久久午夜电影| 一道本一区二区| 蜜臀av性久久久久蜜臀aⅴ四虎 | 久久久久久免费| 亚洲毛片一区二区| 久久综合狠狠综合久久综合88| 国产精品成人久久久久| 亚洲国产日韩一级| 欧美在线视频在线播放完整版免费观看| 欧美激情综合| 久久精视频免费在线久久完整在线看 | 亚洲国产小视频在线观看| 香蕉尹人综合在线观看| 亚洲人成网站777色婷婷| 久久久久久久久久久久久久一区| 欧美视频免费在线观看| 亚洲三级性片| 久久青青草综合| 亚洲在线观看免费| 欧美精品www在线观看| 亚洲二区在线视频| 欧美永久精品| 亚洲无吗在线| 欧美日韩中文字幕综合视频| 亚洲理伦在线| 欧美激情精品久久久久久蜜臀| 久久激情中文| 国产一区91| 久久xxxx| 香蕉乱码成人久久天堂爱免费| 国产精品久久久久天堂| 亚洲视频在线观看视频| 亚洲黄色av一区| 欧美成人免费va影院高清| 亚洲丶国产丶欧美一区二区三区| 久久青草福利网站| 欧美在线高清视频| 国产亚洲二区| 久久久久国产精品麻豆ai换脸| 亚洲制服av| 国产精品亚洲成人| 欧美在线观看你懂的| 亚洲欧美高清| 国产日韩高清一区二区三区在线| 午夜性色一区二区三区免费视频| 在线亚洲自拍| 国产精品视频一区二区三区| 欧美一级午夜免费电影| 亚洲尤物视频网| 国产午夜精品麻豆| 久久免费国产精品1| 久久久国产成人精品| 伊人久久久大香线蕉综合直播| 美女精品网站| 免费视频最近日韩| 99精品免费网| 亚洲一区二区三区午夜| 国产美女一区二区| 久久人人97超碰精品888| 久久久久久香蕉网| 亚洲精品美女91| 亚洲最新色图| 国产欧美日韩91| 蜜臀久久久99精品久久久久久 | 91久久久在线| 国产精品sss| 久久xxxx精品视频| 巨乳诱惑日韩免费av| 99精品视频一区| 亚洲一级黄色| 尤物yw午夜国产精品视频明星 | 久久经典综合| 亚洲六月丁香色婷婷综合久久| 日韩视频在线一区| 国产日韩一区二区三区在线| 蜜桃av一区二区三区| 欧美国产日韩亚洲一区| 午夜精品久久久久99热蜜桃导演| 欧美一区二区三区电影在线观看| 亚洲高清av在线| 日韩亚洲一区二区| 国产一区欧美日韩| 亚洲精品乱码久久久久久| 国产精品一区一区| 欧美激情第3页| 国产精品久久久久久久久免费 | 久久电影一区| 免费不卡中文字幕视频| 亚洲女女女同性video| 久久国产精品99国产| 亚洲免费电影在线| 欧美有码在线视频| 一区二区三区高清在线| 午夜精品一区二区三区电影天堂| 亚洲欧洲一区二区天堂久久 | 免费观看成人| 午夜精品久久久久久久| 另类专区欧美制服同性| 午夜日韩在线| 欧美精品在线免费播放| 久久男人资源视频| 国产精品成人播放| 欧美丰满高潮xxxx喷水动漫| 国产精品亚洲综合天堂夜夜 | 久久亚洲国产精品一区二区| 亚洲综合欧美日韩| 欧美成人免费观看| 久久人人爽人人爽爽久久| 欧美午夜一区二区| 欧美激情视频在线播放| 国产亚洲制服色| 亚洲五月六月| 99这里有精品| 欧美成人国产一区二区|