• <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>

            天行健 君子當自強而不息

            使用DirectInput進行交互(1)


            輸入設備簡介

            計算機通常使用三種輸入設備:鍵盤、鼠標和游戲桿。三種輸入設備都是其他設備所無法替代的,同時每種設備都各有優缺點。鍵盤適用于輸入,但無法取代鼠標,而且和游戲桿相比,鍵盤也不如游戲桿那么靈巧。鼠標適用于定位和移動,但是和游戲桿相比,又缺少控制上的簡易性。至于游戲桿,它適用于簡單的移動----向上、向下、向左和向右移動,除此之外幾乎無任何用途。


            通過鍵盤進行交互

            基本上,鍵盤是按照一定邏輯格式排列的按鍵矩陣。除開一些微小差別之外,大多數鍵盤都有一種標準布局。鍵盤上的每個鍵實際上都是一個開關,當按下或者釋放一個鍵的時候,就觸發了這個開關。按下或者釋放一個鍵就向鍵盤的微處理器發送了一個信號,這樣就在計算機系統上產生了一個中段(interrupt)。系統從鍵盤的微處理器接收數據,從而確定按下或者釋放了哪個鍵,接收的數據被稱為掃描碼(scan code)。

            中斷是各種各樣的信號,它通知系統一個設備或程序需要立即進行處理,使用中斷確保了系統知道設備的狀態已經發生了改變。掃描碼是一些值,它們確定了鍵盤上的哪個鍵被按下或釋放了。這些掃描碼都是一個字節(操作系統可以使用很多方法來表示掃描碼),字節的一部分表示包含了哪個按鍵,一個位表示鍵是否被按下或釋放。掃描碼只能識別單個按鍵,無法區分大寫和小寫字母。因此,大寫字母A和小寫字母a擁有相同的掃描碼,通過跟蹤是否按住了Shift鍵,操作系統自動檢測和區分大小寫字母。

            如下圖所示,這是一個典型的101-102鍵盤,鍵盤的局部放大圖顯示了一些帶有相應掃描碼的鍵,掃描碼是位編碼數字。

            注意掃描碼是按照鍵盤上的順序進行排列的,每行中位于右邊的鍵通常是更高的掃描碼。掃描碼的最低7位(位0--6)表示了鍵值(被按下或者釋放的那個鍵),同時掃描碼的最高位(位7)表示此鍵是否被按下(該位被設置)或者釋放(該位被清除)。字節最高能夠表示的數字是255,且最高位保留,這樣就給出了128個鍵的空間。


            在windows中處理鍵盤

            windows能夠處理檢索鍵盤輸入的一般性任務,為了使工作變得更加容易,windows將從鍵盤接收到的掃描碼轉化成虛擬鍵碼以及ASCII碼的標準碼。windows采用許多方法將這些值報告給程序員,不過通常使用消息過程函數。

            虛擬鍵碼是windows版本的掃描碼,舉例來說,字母A的掃描碼為30,但是虛擬鍵碼不使用這個值,而是使用虛擬鍵碼宏VK_A來表示字母A,不管使用什么樣的鍵盤(以及鍵盤報告的掃描碼),VK_A總是表示字母A。

            ASCII(美國信息交換標準碼,American Standard Code for Information Interchange)是一個標準,它規定了哪個值被映射到哪個字符。使用ASCII能夠為多達128個不同字符映射值,這些字符包括數字、字母表、一般符號以及控制碼。

            windows實際使用的是擴展ASCII碼以及unicode字符(或寬字節字符)。擴展ASCII碼在規則ASCII上添加了信息的額外位,因此將字母的最大數目提升到了256。這樣做也帶來了不利的方面----擴展字符可以是任何東西,因為沒有實質標準來約束這些字符。當然,因為有些其他語言需要更多的字符,因此Unicode就應運而生,它將字符的最大數目擴展到了16位,足夠存儲65536個字符。


            使用DirectInput

            DirectInput是一些COM對象的集合(和所有DirectX組件相同),這些COM對象描繪了輸入系統和各個輸入設備。最主要的對象是DirectInput8,它用于初始化系統以及創建輸入設備接口。

            DirectInput COM對象:

            IDirectInput8:主要的DirectInput8 COM接口,其他所有接口都通過這個接口進行查詢。
            DirectInputDevice8:用于輸入設備的COM接口,每個設備都有自己單獨的接口可供使用。
            DirectInputEffect:用于力反饋效果的 COM接口,比如某些游戲桿和某些鼠標上的力反饋效果。

            各種輸入設備(比如鍵盤、鼠標和游戲桿)都使用相同的接口對象IDirectInputDevice8。某些設備,比如游戲桿和鼠標,能夠通過查詢各自的 IDirectInputDevice8對象以得到另外一個接口IDirectInputEffect,這個接口用于控制設備的力反饋效果。

            IDirectInput8、IDirectInputDevice8、IDirectInputEffect接口之間的關系如下圖所示:

            IDirectInput8組件對象包含了很多用于初始化輸入系統以及獲得設備接口的函數,在這些函數中,常用的只有兩個,它們是 IDirectInput8::EnumDevices和IDirectInput8::CreateDevice。

            初始化DirectInput

            要使用DirectInput,需要確保包含了DInput.h和在工程中鏈接了DInput8.lib,一個IDirectInput8對象就代表了主要DirectInput對象。
            DirectInput提供了幫助函數DirectInput8Create用于初始化IDirectInput8接口。

            Creates a DirectInput object and returns an IDirectInput8 Interface or later interface.

            HRESULT DirectInput8Create(
            HINSTANCE hinst,
            DWORD dwVersion,
            REFIID riidltf,
            LPVOID * ppvOut,
            LPUNKNOWN punkOuter
            );

            Parameters

            hinst
            Instance handle to the application or dynamic-link library (DLL) that is creating the DirectInput object. DirectInput uses this value to determine whether the application or DLL has been certified and to establish any special behaviors that might be necessary for backward compatibility. It is an error for a DLL to pass the handle to the parent application. For example, an Microsoft ActiveX control embedded in a Web page that uses DirectInput must pass its own instance handle, and not the handle to the browser. This ensures that DirectInput recognizes the control and can enable any special behaviors that might be necessary.
            dwVersion
            Version number of DirectInput for which the application is designed. This value is normally DIRECTINPUT_VERSION. If the application defines DIRECTINPUT_VERSION before including Dinput.h, the value must be greater than 0x0800. For earlier versions, use DirectInputCreateEx, which is in Dinput.lib.
            riidltf
            Unique identifier of the desired interface. This value is IID_IDirectInput8A or IID_IDirectInput8W. Passing the IID_IDirectInput8 define selects the ANSI or Unicode version of the interface, depending on whether UNICODE is defined during compilation.
            ppvOut
            Address of a pointer to a variable to receive the interface pointer if the call succeeds.
            punkOuter
            Pointer to the address of the controlling object's IUnknown interface for COM aggregation, or NULL if the interface is not aggregated. Most calling applications pass NULL. If aggregation is requested, the object returned in ppvOut is a pointer to IUnknown, as required by COM aggregation.

            Return Values

            If the function succeeds, the return value is DI_OK. If the function fails, the return value can be one of the following error values: DIERR_BETADIRECTINPUTVERSION, DIERR_INVALIDPARAM, DIERR_OLDDIRECTINPUTVERSION, DIERR_OUTOFMEMORY.

            Remarks

            The DirectInput object created by this function is implemented in Dinput8.dll. Versions of interfaces earlier than DirectX 8.0 cannot be obtained in this implementation.

            To create a DirectX 8.x interface with the latest DirectX SDK without using CoCreateInstance:

            1. Set "#define DIRECTINPUT_VERSION 0x0800" before the include statement for Dinput8.h.
            2. Call DirectInput8Create instead of DirectInputCreateEx.
            3. Link to the Dinput8.lib library instead of Dinput.lib.

            To create a DirectX 8.x interface with the DirectX 8.x SDK without using CoCreateInstance:

            1. Call DirectInput8Create instead of DirectInputCreateEx.
            2. Link to the Dinput8.lib library instead of Dinput.lib.

            To create a DirectX 7.0 interface from the DirectX 8.x or latest DirectX SDK without using CoCreateInstance:

            1. Set "#define DIRECTINPUT_VERSION 0x0700" before the include statement for dinput.h.
            2. Call DirectInputCreateEx instead of DirectInput8Create.
            3. Link to the Dinput.lib library instead of Dinput8.lib.

            To create a DirectX 7.0 interface from the DirectX 8.x or latest DirectX SDK using CoCreateInstance:

            1. Call CoInitializeEx.
            2. Call CoCreateInstance using CLISID_DirectInput.
            3. Use IDirectInput7::Initialize to initialize the DirectInput object.

            To create a DirectX 8.x or DirectX 9.0 interface from the DirectX 8.x or latest DirectX SDK using CoCreateInstance:

            1. Call CoInitializeEx.
            2. Call CoCreateInstance using CLISID_DirectInput8.
            3. Use IDirectInput8::Initialize to initialize the DirectInput object.

            Calling the function with pUnkOuter = NULL is equivalent to creating the object through CoCreateInstance( &CLSID_DirectInput8, punkOuter, CLSCTX_INPROC_SERVER, &IID_IDirectInput8W, lplpDirectInput), then initializing it with IDirectInput8::Initialize.

            Calling the function with pUnkOuter != NULL is equivalent to creating the object through CoCreateInstance( &CLSID_DirectInput8, punkOuter, CLSCTX_INPROC_SERVER, &IID_IUnknown, lplpDirectInput). The aggregated object must be initialized manually.


            使用DirectInput設備的步驟

            1、獲取設備GUID,調用IDirectInput8::EnumDevice來實現。
            2、創建設備COM對象,調用IDirectInput8::CreateDevice來實現。
            3、設置數據格式,調用IDirectInputDevice8::SetDataFormat來實現。
            4、設置協作級別,調用IDirectInputDevice8::SetCooperativeLevel來實現。
            5、設置任何特殊屬性,調用IDirectInputDevice8::SetProperty來實現。
            6、獲得設備,調用IDirectInputDevice8::Acquire來實現。
            7、輪詢設備,調用IDirectInputDevice8::Poll來實現。
            8、讀取數據,調用IDirectInputDevice8::GetDeviceState來實現。

            在進行這些步驟前,要確保聲明了一個IDirectInput設備對象,即IDirectInputDevice8對象。

            獲取設備GUID

            每個安裝的設備都有一個系統分配的全局惟一標識符(global unique identification, GUID)數字。要使用一個設備,首先必須知道它的GUID。對于連接到系統上的鼠標和鍵盤,得到他們的GUID非常容易,DirectInput分別為鼠標和鍵盤的GUID定義成GUID_SysKeyboard和GUID_SysMouse。要使用GUID_SysKeyboard或 GUID_SysMouse,必須在所有其他的預處理程序指令前定義INITGUID,或者將DXGuid.lib庫鏈接到項目中。至于其他設備,必須枚舉出這些設備,才能得到需要的那些設備的GUID。枚舉就是遍歷一個含有數據項的列表的過程,數據項就是諸如游戲桿之類的輸入設備。假設有5個游戲桿連接到了系統上,那么在枚舉的過程中,DirectInput就會傳遞各個游戲桿的相關信息,而且每次只傳遞一個游戲桿的信息,直到所有的游戲桿都已經被列出來或者列舉被強行終止。

            用于枚舉設備的函數是IDirectInput8::EnumDevice。

            Enumerates available devices.

            HRESULT EnumDevices(
            DWORD dwDevType,
            LPDIENUMDEVICESCALLBACK lpCallback,
            LPVOID pvRef,
            DWORD dwFlags
            );

            Parameters

            dwDevType

            Device type filter.

            To restrict the enumeration to a particular type of device, set this parameter to a DI8DEVTYPE_* value. See DIDEVICEINSTANCE.

            To enumerate a class of devices, use one of the following values.

             

            DI8DEVCLASS_ALL
            All devices.
            DI8DEVCLASS_DEVICE
            All devices that do not fall into another class.
            DI8DEVCLASS_GAMECTRL
            All game controllers.
            DI8DEVCLASS_KEYBOARD
            All keyboards. Equivalent to DI8DEVTYPE_KEYBOARD.
            DI8DEVCLASS_POINTER
            All devices of type DI8DEVTYPE_MOUSE and DI8DEVTYPE_SCREENPOINTER.
            lpCallback
            Address of a callback function to be called once for each device enumerated. See DIEnumDevicesCallback.
            pvRef
            Application-defined 32-bit value to be passed to the enumeration callback each time it is called.
            dwFlags
            Flag value that specifies the scope of the enumeration. This parameter can be one or more of the following values:
            DIEDFL_ALLDEVICES
            All installed devices are enumerated. This is the default behavior.
            DIEDFL_ATTACHEDONLY
            Only attached and installed devices.
            DIEDFL_FORCEFEEDBACK
            Only devices that support force feedback.
            DIEDFL_INCLUDEALIASES
            Include devices that are aliases for other devices.
            DIEDFL_INCLUDEHIDDEN
            Include hidden devices. For more information about hidden devices, see DIDEVCAPS.
            DIEDFL_INCLUDEPHANTOMS
            Include phantom (placeholder) devices.

            Return Values

            If the method succeeds, the return value is DI_OK. If the method fails, the return value can be one of the following error values: DIERR_INVALIDPARAM, DIERR_NOTINITIALIZED.

            Remarks

            All installed devices can be enumerated, even if they are not present. For example, a flight stick might be installed on the system but not currently plugged into the computer. Set the dwFlags parameter to indicate whether only attached or all installed devices should be enumerated. If the DIEDFL_ATTACHEDONLY flag is not present, all installed devices are enumerated.

            A preferred device type can be passed as a dwDevType filter so that only the devices of that type are enumerated.

            On Microsoft Windows XP, DirectInput enumerates only one mouse and one keyboard device, referred to as the system mouse and the system keyboard. These devices represent the combined output of all mice and keyboards respectively on a system. For information about how to read from multiple mice or keyboards individually on Windows XP, see the WM_INPUT documentation.

            Note    The order in which devices are enumerated by DirectInput is not guaranteed.



            lpCallback是一個指向枚舉函數的指針,在系統上每找到一個匹配的設備時,就會調用該函數。
             

            Application-defined callback function that receives DirectInput devices as a result of a call to the IDirectInput8::EnumDevices method.

            BOOL DIEnumDevicesCallback(
            LPCDIDEVICEINSTANCE lpddi,
            LPVOID pvRef
            );

            Parameters

            lpddi
            Address of a DIDEVICEINSTANCE structure that describes the device instance.
            pvRef
            The application-defined value passed to IDirectInput8::EnumDevices or IDirectInput8::EnumDevicesBySemantics as the pvRef parameter.

            Return Values

            Returns DIENUM_CONTINUE to continue the enumeration or DIENUM_STOP to stop the enumeration.

            Remarks

            If a single hardware device can function as more than one DirectInput device type, it is enumerated as each device type that it supports. For example, a keyboard with a built-in mouse is enumerated twice: once as a keyboard and once as a mouse. The product globally unique identifier (GUID) is the same for each device, however.



            lpddi是一個指向DIDEVICEINSTANCE結構體的指針,此結構體包含了此次調用時當前枚舉設備上的信息。

            Describes an instance of a DirectInput device. This structure is used with the IDirectInput8::EnumDevices, IDirectInput8::EnumDevicesBySemantics, and IDirectInputDevice8::GetDeviceInfo methods.

            typedef struct DIDEVICEINSTANCE {
            DWORD dwSize;
            GUID guidInstance;
            GUID guidProduct;
            DWORD dwDevType;
            TCHAR tszInstanceName[MAX_PATH];
            TCHAR tszProductName[MAX_PATH];
            GUID guidFFDriver;
            WORD wUsagePage;
            WORD wUsage;
            } DIDEVICEINSTANCE, *LPDIDEVICEINSTANCE;

            Members

            dwSize
            Size of this structure, in bytes. This member must be initialized before the structure is used.
            guidInstance
            Unique identifier for the instance of the device. An application can save the instance globally unique identifier (GUID) into a configuration file and use it at a later time. Instance GUIDs are specific to a particular computer. An instance GUID obtained from one computer is unrelated to instance GUIDs on another.
            guidProduct
            Unique identifier for the product. This identifier is established by the manufacturer of the device.
            dwDevType
            Device type specifier. The least-significant byte of the device type description code specifies the device type. The next-significant byte specifies the device subtype. This value can also be combined with DIDEVTYPE_HID, which specifies a Human Interface Device (human interface device).
            tszInstanceName
            Friendly name for the instance. For example, "Joystick 1."
            tszProductName
            Friendly name for the product.
            guidFFDriver
            Unique identifier for the driver being used for force feedback. The driver's manufacturer establishes this identifier.
            wUsagePage
            If the device is a Human Interface Device (HID), this member contains the HID usage page code.
            wUsage
            If the device is a Human Interface Device (HID), this member contains the HID usage code.

            Remarks

            The following device types and subtypes are defined for use in the dwDevType member.

            • DI8DEVTYPE_1STPERSON

              First-person action game device. The following subtypes are defined.

              • DI8DEVTYPE1STPERSON_LIMITED

                Device that does not provide the minimum number of device objects for action mapping.

              • DI8DEVTYPE1STPERSON_SHOOTER

                Device designed for first-person shooter games.

              • DI8DEVTYPE1STPERSON_SIXDOF

                Device with six degrees of freedom; that is, three lateral axes and three rotational axes.

              • DI8DEVTYPE1STPERSON_UNKNOWN

                Unknown subtype.

            • DI8DEVTYPE_DEVICE

              Device that does not fall into another category.

            • DI8DEVTYPE_DEVICECTRL

              Input device used to control another type of device from within the context of the application. The following subtypes are defined.

              • DI8DEVTYPEDEVICECTRL_COMMSSELECTION

                Control used to make communications selections.

              • DI8DEVTYPEDEVICECTRL_COMMSSELECTION_HARDWIRED

                Device that must use its default configuration and cannot be remapped.

              • DI8DEVTYPEDEVICECTRL_UNKNOWN

                Unknown subtype.

            • DI8DEVTYPE_DRIVING

              Device for steering. The following subtypes are defined.

              • DI8DEVTYPEDRIVING_COMBINEDPEDALS

                Steering device that reports acceleration and brake pedal values from a single axis.

              • DI8DEVTYPEDRIVING_DUALPEDALS

                Steering device that reports acceleration and brake pedal values from separate axes.

              • DI8DEVTYPEDRIVING_HANDHELD

                Hand-held steering device.

              • DI8DEVTYPEDRIVING_LIMITED

                Steering device that does not provide the minimum number of device objects for action mapping.

              • DI8DEVTYPEDRIVING_THREEPEDALS

                Steering device that reports acceleration, brake, and clutch pedal values from separate axes.

            • DI8DEVTYPE_FLIGHT

              Controller for flight simulation. The following subtypes are defined.

              • DI8DEVTYPEFLIGHT_LIMITED

                Flight controller that does not provide the minimum number of device objects for action mapping.

              • DI8DEVTYPEFLIGHT_RC

                Flight device based on a remote control for model aircraft.

              • DI8DEVTYPEFLIGHT_STICK

                Joystick.

              • DI8DEVTYPEFLIGHT_YOKE

                Yoke.

            • DI8DEVTYPE_GAMEPAD

              Gamepad. The following subtypes are defined.

              • DI8DEVTYPEGAMEPAD_LIMITED

                Gamepad that does not provide the minimum number of device objects for action mapping.

              • DI8DEVTYPEGAMEPAD_STANDARD

                Standard gamepad that provides the minimum number of device objects for action mapping.

              • DI8DEVTYPEGAMEPAD_TILT

                Gamepad that can report x-axis and y-axis data based on the attitude of the controller.

            • DI8DEVTYPE_JOYSTICK

              Joystick. The following subtypes are defined.

              • DI8DEVTYPEJOYSTICK_LIMITED

                Joystick that does not provide the minimum number of device objects for action mapping.

              • DI8DEVTYPEJOYSTICK_STANDARD

                Standard joystick that provides the minimum number of device objects for action mapping.

            • DI8DEVTYPE_KEYBOARD

              Keyboard or keyboard-like device. The following subtypes are defined.

              • DI8DEVTYPEKEYBOARD_UNKNOWN

                Subtype could not be determined.

              • DI8DEVTYPEKEYBOARD_PCXT

                IBM PC/XT 83-key keyboard.

              • DI8DEVTYPEKEYBOARD_OLIVETTI

                Olivetti 102-key keyboard.

              • DI8DEVTYPEKEYBOARD_PCAT

                IBM PC/AT 84-key keyboard.

              • DI8DEVTYPEKEYBOARD_PCENH

                IBM PC Enhanced 101/102-key or Microsoft Natural keyboard.

              • DI8DEVTYPEKEYBOARD_NOKIA1050

                Nokia 1050 keyboard.

              • DI8DEVTYPEKEYBOARD_NOKIA9140

                Nokia 9140 keyboard.

              • DI8DEVTYPEKEYBOARD_NEC98

                Japanese NEC PC98 keyboard.

              • DI8DEVTYPEKEYBOARD_NEC98LAPTOP

                Japanese NEC PC98 laptop keyboard.

              • DI8DEVTYPEKEYBOARD_NEC98106

                Japanese NEC PC98 106-key keyboard.

              • DI8DEVTYPEKEYBOARD_JAPAN106

                Japanese 106-key keyboard.

              • DI8DEVTYPEKEYBOARD_JAPANAX

                Japanese AX keyboard.

              • DI8DEVTYPEKEYBOARD_J3100

                Japanese J3100 keyboard.

            • DI8DEVTYPE_MOUSE

              A mouse or mouse-like device (such as a trackball). The following subtypes are defined.

              • DI8DEVTYPEMOUSE_ABSOLUTE

                Mouse that returns absolute axis data.

              • DI8DEVTYPEMOUSE_FINGERSTICK

                Fingerstick.

              • DI8DEVTYPEMOUSE_TOUCHPAD

                Touchpad.

              • DI8DEVTYPEMOUSE_TRACKBALL

                Trackball.

              • DI8DEVTYPEMOUSE_TRADITIONAL

                Traditional mouse.

              • DI8DEVTYPEMOUSE_UNKNOWN

                Subtype could not be determined.

            • DI8DEVTYPE_REMOTE

              Remote-control device. The following subtype is defined.

              • DI8DEVTYPEREMOTE_UNKNOWN

                Subtype could not be determined.

            • DI8DEVTYPE_SCREENPOINTER

              Screen pointer. The following subtypes are defined.

              • DI8DEVTYPESCREENPTR_UNKNOWN

                Unknown subtype.

              • DI8DEVTYPESCREENPTR_LIGHTGUN

                Light gun.

              • DI8DEVTYPESCREENPTR_LIGHTPEN

                Light pen.

              • DI8DEVTYPESCREENPTR_TOUCH

                Touch screen.

            • DI8DEVTYPE_SUPPLEMENTAL

              Specialized device with functionality unsuitable for the main control of an application, such as pedals used with a wheel. The following subtypes are defined.

              • DI8DEVTYPESUPPLEMENTAL_2NDHANDCONTROLLER

                Secondary handheld controller.

              • DI8DEVTYPESUPPLEMENTAL_COMBINEDPEDALS

                Device whose primary function is to report acceleration and brake pedal values from a single axis.

              • DI8DEVTYPESUPPLEMENTAL_DUALPEDALS

                Device whose primary function is to report acceleration and brake pedal values from separate axes.

              • DI8DEVTYPESUPPLEMENTAL_HANDTRACKER

                Device that tracks hand movement.

              • DI8DEVTYPESUPPLEMENTAL_HEADTRACKER

                Device that tracks head movement.

              • DI8DEVTYPESUPPLEMENTAL_RUDDERPEDALS

                Device with rudder pedals.

              • DI8DEVTYPESUPPLEMENTAL_SHIFTER

                Device that reports gear selection from an axis.

              • DI8DEVTYPESUPPLEMENTAL_SHIFTSTICKGATE

                Device that reports gear selection from button states.

              • DI8DEVTYPESUPPLEMENTAL_SPLITTHROTTLE

                Device whose primary function is to report at least two throttle values. It may have other controls.

              • DI8DEVTYPESUPPLEMENTAL_THREEPEDALS

                Device whose primary function is to report acceleration, brake, and clutch pedal values from separate axes.

              • DI8DEVTYPESUPPLEMENTAL_THROTTLE

                Device whose primary function is to report a single throttle value. It may have other controls.

              • DI8DEVTYPESUPPLEMENTAL_UNKNOWN

                Unknown subtype.

            Versions of DirectInput earlier than DirectX 8.0 have a somewhat different scheme of device types and subtypes. See the DIDEVTYPExxx defines in Dinput.h.


            創建設備COM對象

            有了設備GUID,就能創建實際的IDirectInputDevice8 COM對象了,用于創建此COM對象的函數是IDirectInput8::CreateDevice。

            Creates and initializes an instance of a device based on a given globally unique identifier (GUID), and obtains an IDirectInputDevice8 Interface interface.

            HRESULT CreateDevice(
            REFGUID rguid,
            LPDIRECTINPUTDEVICE * lplpDirectInputDevice,
            LPUNKNOWN pUnkOuter
            );

            Parameters

            rguid
            Reference to the GUID for the desired input device (see Remarks). The GUID is retrieved through the IDirectInput8::EnumDevices method, or it can be one of the predefined GUIDs listed below. For the following GUID values to be valid, your application must define INITGUID before all other preprocessor directives at the beginning of the source file, or link to Dxguid.lib.
            GUID_SysKeyboard
            The default system keyboard.
            GUID_SysMouse
            The default system mouse.
            lplpDirectInputDevice
            Address of a variable to receive the IDirectInputDevice8 Interface interface pointer if successful.
            pUnkOuter
            Address of the controlling object's IUnknown interface for COM aggregation, or NULL if the interface is not aggregated. Most calling applications pass NULL.

            Return Values

            If the method succeeds, the return value is DI_OK. If the method fails, the return value can be one of the following: DIERR_DEVICENOTREG, DIERR_INVALIDPARAM, DIERR_NOINTERFACE, DIERR_NOTINITIALIZED, DIERR_OUTOFMEMORY.

            Remarks

            Calling this method with pUnkOuter = NULL is equivalent to creating the object by CoCreateInstance (&CLSID_DirectInputDevice, NULL, CLSCTX_INPROC_SERVER, riid, lplpDirectInputDevice) and then initializing it with Initialize.

            Calling this method with pUnkOuter != NULL is equivalent to creating the object by CoCreateInstance (&CLSID_DirectInputDevice, punkOuter, CLSCTX_INPROC_SERVER, &IID_IUnknown, lplpDirectInputDevice). The aggregated object must be initialized manually.

             

            閱讀下篇:使用DirectInput進行交互(2)

            posted on 2007-07-24 01:23 lovedday 閱讀(3636) 評論(0)  編輯 收藏 引用

            公告

            導航

            統計

            常用鏈接

            隨筆分類(178)

            3D游戲編程相關鏈接

            搜索

            最新評論

            日产精品99久久久久久| 久久久久亚洲AV无码专区首JN | 国产午夜福利精品久久| 国产高潮久久免费观看| 伊人热热久久原色播放www| 激情伊人五月天久久综合 | 香蕉99久久国产综合精品宅男自| 久久只有这精品99| www久久久天天com| 亚洲欧美精品一区久久中文字幕| 久久精品国产清高在天天线| 久久夜色撩人精品国产| 久久久精品人妻一区二区三区蜜桃| 亚洲精品高清国产一久久| 久久精品国产精品亚洲精品| 久久福利片| 国产精品久久久久天天影视| 亚洲中文久久精品无码| 国产毛片久久久久久国产毛片| 久久无码人妻一区二区三区午夜| 伊人久久精品影院| 久久久这里有精品中文字幕| 久久青草国产手机看片福利盒子| 久久精品亚洲AV久久久无码| 日韩精品无码久久一区二区三| 亚洲精品高清久久| 久久综合久久综合九色| 国内精品久久久久影院日本 | 三级韩国一区久久二区综合| 国产成人无码精品久久久免费| 97久久精品无码一区二区天美| 国产亚洲精久久久久久无码77777| 日本亚洲色大成网站WWW久久 | 日韩欧美亚洲综合久久影院Ds| 久久国产成人午夜aⅴ影院| 人人狠狠综合久久亚洲88| 国产精品久久久久久久久免费| 久久久久综合网久久| 久久婷婷久久一区二区三区| 亚洲国产精品久久久久久| 国产精品成人99久久久久 |