2011-11-21 2 views
3

저는 Kinect에 맞서 프로그래밍을 해왔습니다. 이제는 게임이 내가 Kinect에서하고있는 것과 반응하도록하고 싶습니다. 메모장에서 키 누르기를 위해 데이터를 보내는 것은 쉽지만 게임으로 보내려면 훨씬 더 어렵습니다.GlovePIE와 같은 가짜 입력

먼저 Kinect의 WPF 스켈레톤 예제를 사용하고 있습니다. C++ 버전을 사용할 수는 있지만 C++은 매우 녹슨 것이므로 선호하지 않을 것입니다.

그래서 지금까지 내가 한 것은 SendKeys, SendInput, keybd_event, Post_Message입니다. 그 누구도 Burnout Paradise와 같은 게임을 만들지 않습니다.

GlovePIE 입력이 게임에 도착하는 것을 알고 있지만 어떻게해야합니까? 현재/해킹 주위에 내 작품은 C++에서 샘플 코드를 가지고있는 PPJoy를 사용하여 버튼 누르기를 에뮬레이트합니다. 내 WPF 앱에서 [DllImport]를 통해 이것을 호출합니다. 그런 다음 GlovePIE에서 조이스틱 버튼을 누르고 그것이 키보드 키로 변환됩니다. 따라서 작동하는 원에서 돌아 다니지만 PPJoys 드라이버는 서명되지 않았으므로 사람들이 테스트 서명 된 드라이버를 허용해야하므로이 코드를 실제로 공유 할 수는 없습니다.

GlovePIE으로 Keypresses를 만드는 방법을 아는 사람이 있습니까? 나는 GlovePIE 포럼에 올렸지 만 응답은 없습니다. GlovePIE는 이전 openNI kinect 드라이버와 작동 할 수있는 약간의 해킹이 있지만 몇 주 전에 출시 된 표준 microsoft 버전을 사용하고 있습니다.

답변

1

좋아, 자신의 질문에 대한 답변이 무엇인지 잘 모르겠지만, 나는 적절한 해결책을 알아 냈고 응답을 확인했습니다.

는 먼저 C#에서 사용하기 위해 C 방법을 가져옵니다 클래스

[DllImport("user32.dll", EntryPoint = "keybd_event", CharSet = CharSet.Auto, ExactSpelling = true)] 
public static extern void Keybd_event(byte vk, byte scan, int flags, int extrainfo); 

이에

using System.Runtime.InteropServices; 

그런 다음 수업이에게이를 넣어 사용하여이 문을 포함합니다. 일부 게임/응용 프로그램에서는 가상 키 VKey를 사용하고 일부는 (직접 X 일명 DI 키) Scancodes를 사용합니다. 내 문제는 스캔 코드를 부적절하게 사용하여 일부 게임에서는 작동하지 않는다는 것입니다. 어떤 응용 프로그램이 이들을 소비하려고하는지 모를 경우에는 가상 키와 직접 입력 키를 사용하여 두 번 호출하십시오.

다음은 가상 키를 사용하여 문자 'A'를 두 번 호출 한 예입니다. 직접 입력 키. 당신이 값을 말할 수

KEYDOWN = 0 
KEYUP = 2 
//Virtual Key 
Keybd_event(65, 0, KEYDOWN, 0); 

//Direct Input Key 
Keybd_event(0, 30, KEYDOWN, 0); 

, 링크 모두가 HEX 값으로 관련 을 DIK 할 VK는 다른 동안 쇼 자료 10 (정수)

VKeys 링크 http://delphi.about.com/od/objectpascalide/l/blvkc.htm

위 내 샘플

DIKeys는 또한 SendInput을 위해 일해야

http://community.bistudio.com/wiki/DIK_KeyCodes를 연결하지만, 나는 완전히 그것을 확인하지 않았습니다.

0

GlovePIE을 모르겠다. 죄송하지만 아마도 도움이 될 것입니다.

에뮬레이트하는 키 스트로크를 처리 할 때 PostMessage 및 SendMessage의 동작이 달라집니다. 실제로 보내는 메시지, keydown/up, keypress 등을 알 수 있습니다.

포커스 변경에 대해 뭔가를해야합니다. 잘못된 요소가 선택되었거나 잘못된 (하위) 창문.

비슷하게 마우스 클릭을 에뮬레이트하는 경우 마우스가 클릭 가능한 영역에 있는지 확인하는 위치도 확인할 수 있습니다.

또한 키를 누른 상태로 유지하면 여러 가지 주요 메시지를 보내는 반복 메커니즘이 트리거되는 것을 고려하십시오. 일반적으로 게임에서 한 번만 누르지 않아도 키를 누르고 있습니다.

+0

나는 sleep을 사용하고 keyup 명령을 보내서 키를 "누르고있다". 모든 것은 메모장에서 훌륭하게 작동하며, 나는 또한 키 입력을 보내는 창/서브 윈도우를 지정하지 않아도됩니다. 그래서 나는 그것을 게임/응용 불가 지론으로 유지할 수 없다. 그래도 몇 가지 아이디어를 가져 주셔서 감사합니다. – Maz

+0

여러 가지에 따라 앱에서 키 업 시간보다 오래 걸릴 수도 있습니다. 또는 무시하고 여러 개의 'wm_char'메시지를 보는 것과 같은 다른 용도를 사용하는 것입니다. '\t :: SendMessage (hWND, WM_KEYDOWN, VK_RETURN, 0); :: SendMessage (hWND, WM_CHAR, VK_RETURN, 0); :: SendMessage (hWND, WM_CHAR, VK_RETURN, 0); :: SendMessage (hWND, WM_KEYUP, VK_RETURN, 0); ' –

0

나는 이것이 최선의 대답이라고 말하지 않지만, 나는 내가 사용하고있는 해결책으로 되돌아 가고 싶었다. 내가 서명 한 vJoy http://headsoft.com.au/index.php?category=vjoy을 사용할 수 있음을 발견 했으므로 Windows 7 64 비트에서 사용할 수 있습니다. 나는 내가 Keybd_event(CKEY, SCANCODE, KEYDOWN, 0); 다음 X 프레임은 나중에

Keybd_event(CKEY, SCANCODE, KEYUP, 0);은 내가 keybd_event를 통해 보내 "C"또는 다른 키를 읽어 올 vJoy을 설정하려면 전화가에서이 통근 keybd_event

[DllImport("user32.dll", EntryPoint = "keybd_event", CharSet = CharSet.Auto, ExactSpelling = true)] 
public static extern void Keybd_event(byte vk, byte scan, int flags, int extrainfo); 

를 호출 할 수 있습니다. vJoy가이를 올바르게 읽은 다음 GlovePIE에서 선택하는 관련 버튼을 "누르십시오". GlovePIE 내 스크립트는 다음과 같습니다.

A = joystick1.Button1 
Z = joystick1.Button2 

나는 시도한 게임에서 작동합니다. 이것은 분명히 좋지 않지만, 최종 사용자가 vJoy 및 GlovePIE를 통해 입력을 사용자 정의 할 수있게 해줍니다.