`
黑色杰克史密斯
  • 浏览: 15236 次
社区版块
存档分类
最新评论

Dinput8 杂

    博客分类:
  • n/a
 
阅读更多
10 12 00 00             _c_rgodfDIKeyboard dd offset _GUID_Key  ; DATA XREF: .rdata:00000200o
.data:00000208 00                                      db    0
.data:00000209 00                                      db    0
.data:0000020A 00                                      db    0
.data:0000020B 00                                      db    0
.data:0000020C 0C                                      db  0Ch
.data:0000020D 00                                      db    0
.data:0000020E 00                                      db    0
.data:0000020F 80                                      db  80h ; €
.data:00000210 00                                      db    0
.data:00000211 00                                      db    0
.data:00000212 00                                      db    0
.data:00000213 00                                      db    0

.rdata:000001EC 18                      _c_dfDIKeyboard db  18h
.rdata:000001ED 00                                      db    0
.rdata:000001EE 00                                      db    0
.rdata:000001EF 00                                      db    0
.rdata:000001F0 10                                      db  10h
.rdata:000001F1 00                                      db    0
.rdata:000001F2 00                                      db    0
.rdata:000001F3 00                                      db    0
.rdata:000001F4 02                                      db    2
.rdata:000001F5 00                                      db    0
.rdata:000001F6 00                                      db    0
.rdata:000001F7 00                                      db    0
.rdata:000001F8 00                                      db    0
.rdata:000001F9 01                                      db    1
.rdata:000001FA 00                                      db    0
.rdata:000001FB 00                                      db    0
.rdata:000001FC 00                                      db    0
.rdata:000001FD 01                                      db    1
.rdata:000001FE 00                                      db    0
.rdata:000001FF 00                                      db    0
.rdata:00000200 04 02 00 00                             dd offset _c_rgodfDIKeyboard

const GUID GUID_Key =         {0x55728220, 0xD33C, 0x11CF, [0xBF, 0xC7, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00]};

#include <windows.h>
#include <dinput.h>

#define INPUT  __declspec(dllimport)
#define OUTPUT __declspec(dllexport)

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}

UCHAR HitFlag[256] = {0};
UCHAR KeyArry[256] = {0};

HWND main_window_handle = nullptr;

HINSTANCE main_instance_handle = nullptr;

LPDIRECTINPUT8        lpdi      = nullptr;
LPDIRECTINPUTDEVICE8  lpdikey   = nullptr;
LPDIRECTINPUTDEVICE8  lpdimouse = nullptr;
LPDIRECTINPUTDEVICE8  lpdijoy   = nullptr;

EXTERN_C OUTPUT BOOL CDECL InitInput(HWND hWnd, HINSTANCE hInst)
{
main_window_handle   = hWnd;
main_instance_handle = hInst;

return SUCCEEDED(DirectInput8Create (hInst,
DIRECTINPUT_VERSION,
IID_IDirectInput8,
(void **)&lpdi,
nullptr));
}

EXTERN_C OUTPUT BOOL CDECL InitKeyBoard(DWORD dwFlags)
{
BOOL val = 0;

val |= lpdi->CreateDevice (GUID_SysKeyboard, &lpdikey, nullptr);
val |= lpdikey->SetCooperativeLevel (main_window_handle, dwFlags);
val |= lpdikey->SetDataFormat(&c_dfDIKeyboard);
val |= lpdikey->Acquire();

return !val;
}

EXTERN_C OUTPUT BOOL CDECL GetKeyUp(DWORD KeyIndex)
{
// if(lpdikey->GetDeviceState(256, (LPVOID)KeyArry) != DIERR_INPUTLOST) {
lpdikey->GetDeviceState(256, (LPVOID)KeyArry);
__asm cmp eax, 8007001Eh // DIERR_INPUTLOST
__asm jnz most_hit_branch

if (lpdikey->Acquire() != S_OK) {
__asm int 3
} return lpdikey->GetDeviceState(256, (LPVOID)KeyArry);
__asm align 16
most_hit_branch:
UCHAR u8Temp;
  u8Temp= HitFlag[KeyIndex];

HitFlag[KeyIndex] = KeyArry[KeyIndex] | ((0x80^HitFlag[KeyIndex]) & HitFlag[KeyIndex]);

return ((0x80 ^ KeyArry[KeyIndex]) & u8Temp);
// }
// else {
// if (lpdikey->Acquire() != S_OK) {
// __asm int 3
// } lpdikey->GetDeviceState(256, (LPVOID)KeyArry);
// }
// return 233;
/*
if(lpdikey->GetDeviceState(256, (LPVOID)KeyArry)==DIERR_INPUTLOST)
{
lpdikey->Acquire();
}
if (KeyArry[KeyIndex]  )
{
HitFlag[KeyIndex]=0x80;
return FALSE;
}
else if (HitFlag[KeyIndex] == 0x80)
{
HitFlag[KeyIndex] = 0;
return TRUE;
}
else
return FALSE;*/
}

EXTERN_C OUTPUT BOOL CDECL GetKeyDown(DWORD KeyIndex)
{
// if(lpdikey->GetDeviceState(256, (LPVOID)KeyArry) != DIERR_INPUTLOST) {
lpdikey->GetDeviceState(256, (LPVOID)KeyArry);
__asm cmp eax, 8007001Eh
__asm jnz most_hit_branch

if (lpdikey->Acquire() != S_OK) {
__asm int 3
} return lpdikey->GetDeviceState(256, (LPVOID)KeyArry);
__asm align 16
most_hit_branch:
HitFlag[KeyIndex] |= KeyArry[KeyIndex];
  return KeyArry[KeyIndex];
//} else {
// if (lpdikey->Acquire() != S_OK) {
//__asm int 3
// } lpdikey->GetDeviceState(256, (LPVOID)KeyArry);
//} return 233;
}

EXTERN_C OUTPUT BOOL CDECL ShutDownInput ()
{
BOOL val = 0;

if(lpdikey != nullptr)
val |= lpdikey->Unacquire()   | lpdikey->Release();

if(lpdimouse != nullptr)
val |= lpdimouse->Unacquire() | lpdimouse->Release();

if(lpdijoy != nullptr)
val |= lpdijoy->Unacquire()   | lpdijoy->Release();

if(lpdikey != nullptr)
val |= lpdi->Release();

return !val;
}

EXTERN_C OUTPUT BOOL CDECL InitMouse(DWORD KeyIndex)
{
return 0;
}

EXTERN_C OUTPUT BOOL CDECL InitJoy(HWND hWnd, HINSTANCE hInst)
{
return 0;
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics