c++ - Visual Studio C++ 控制台操纵杆

标签 c++ console usb mouse joystick

我尝试从 this section 编译代码

它说它可以工作 C++ 控制台应用程序操纵杆控制鼠标移动和鼠标按钮单击。但我收到 C2061 错误未声明的标识符。

这里是我在 C++ 控制台应用程序中修改的代码:

// TestJoyConsole.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <cstdio>
#ifndef D_INPUT
#define D_INPUT
#include <dinput.h>
#endif

LPDIRECTINPUT8 di;
HRESULT hr;
LPDIRECTINPUTDEVICE8 joystick;
DIDEVICEINSTANCE pdidi;
DIDEVICEINSTANCE info;

BOOL CALLBACK
enumAxesCallback(const DIDEVICEOBJECTINSTANCE* instance, VOID* context)
{
HWND hDlg = (HWND)context;

DIPROPRANGE propRange;
propRange.diph.dwSize = sizeof(DIPROPRANGE);
propRange.diph.dwHeaderSize = sizeof(DIPROPHEADER);
propRange.diph.dwHow = DIPH_BYID;
propRange.diph.dwObj = instance->dwType;
propRange.lMin = -50;
propRange.lMax = +50;

if (FAILED(joystick->SetProperty(DIPROP_RANGE, &propRange.diph))) {
    return DIENUM_STOP;
}

return DIENUM_CONTINUE;
}

BOOL CALLBACK
enumCallback(const DIDEVICEINSTANCE* instance, VOID* context)
{
HRESULT hr;

hr = di->CreateDevice(instance->guidInstance, &joystick, NULL);

if (FAILED(hr)) {
    return DIENUM_CONTINUE;
}
return DIENUM_STOP;
}


int _tmain(int argc, _TCHAR* argv[])
{

int counter = 0;
while (counter++ <= 100)
{
    Joy* q1 = new Joy();
    q1 -> start();

    system("PAUSE");
    return 0;
}
}







class Joy
{
public:

HRESULT
    poll(DIJOYSTATE *js)
{
        HRESULT    hr;

        if (joystick == NULL)
        {
            return S_OK;
        }

        // Poll the device to read the current state
        hr = joystick->Poll();
        if (FAILED(hr)) {
            // DInput is telling us that the input stream has been
            // interrupted. We aren't tracking any state between polls, so
            // we don't have any special reset that needs to be done. We
            // just re-acquire and try again.
            hr = joystick->Acquire();
            while (hr == DIERR_INPUTLOST) {
                hr = joystick->Acquire();
            }

            // If we encounter a fatal error, return failure.
            if ((hr == DIERR_INVALIDPARAM) || (hr == DIERR_NOTINITIALIZED)) {
                return E_FAIL;
            }

            // If another application has control of this device, return successfully.
            // We'll just have to wait our turn to use the joystick.
            if (hr == DIERR_OTHERAPPHASPRIO) {
                return S_OK;
            }
        }
        // Get the input's device state
        if (FAILED(hr = joystick->GetDeviceState(sizeof(DIJOYSTATE), js))) {
            return hr; // The device should have been acquired during the Poll()
        }

        return S_OK;
    }
void GetDesktopResolution(int& horizontal, int& vertical)
{
    RECT desktop;

    // Get a handle to the desktop window
    const HWND hDesktop = GetDesktopWindow();

    // Get the size of screen to the variable desktop
    GetWindowRect(hDesktop, &desktop);

    horizontal = desktop.right;
    vertical = desktop.bottom;
}

void moveMouse(int dx, int dy)
{
    POINT pt;
    int horizontal = 0;
    int vertical = 0;

    GetDesktopResolution(horizontal, vertical);

    GetCursorPos(&pt);

    pt.x += dx;
    pt.y += dy;

    if (pt.x < 0)
    {
        pt.x = 0;
    }
    if (pt.x > horizontal)
    {
        pt.x = horizontal;
    }

    if (pt.y < 0)
    {
        pt.y = 0;
    }
    if (pt.y > vertical)
    {
        pt.y = vertical;
    }

    SetCursorPos(pt.x, pt.y);
}

void clickMouse()
{
    if (GetKeyState(VK_LBUTTON) >= 0)
    {
        mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
    }
}
void unclickMouse()
{
    mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
}

void close()
{
    if (joystick)
    {
        joystick->Unacquire();
    }
}

int start()
{
    DIJOYSTATE js;                                        // struktura stanu joysticka

    // Create a DirectInput device
    if (FAILED(hr = DirectInput8Create(GetModuleHandle(NULL), DIRECTINPUT_VERSION,
        IID_IDirectInput8, (VOID**)&di, NULL))) {
        return hr;
    }

    if (FAILED(hr = di->EnumDevices(DI8DEVCLASS_GAMECTRL, enumCallback,
        NULL, DIEDFL_ATTACHEDONLY))) {
        return hr;
    }

    // sprawdzenie czy jest joystick
    if (joystick == NULL) {

        std::cout << "Joystick not found.\n";
        system("pause");
        return E_FAIL;
    }

    // ustawienia
    DIDEVCAPS capabilities;

    // zdefiniowanie formatu danych urzadzenia
    if (FAILED(hr = joystick->SetDataFormat(&c_dfDIJoystick)))
    {
        return hr;
    }

    // Powiazanie urzadzenia z oknem aplikacji
    if (FAILED(hr = joystick->SetCooperativeLevel(GetConsoleWindow(), DISCL_NONEXCLUSIVE | DISCL_FOREGROUND))) {
        return hr;
    }

    // wczytanie ustawien joysticka
    capabilities.dwSize = sizeof(DIDEVCAPS);
    if (FAILED(hr = joystick->GetCapabilities(&capabilities))) {

        return hr;
    }

    // wyliczanie
    if (FAILED(hr = joystick->EnumObjects(enumAxesCallback, NULL, DIDFT_AXIS))) {
        return hr;
    }

    info.dwSize = sizeof(DIDEVICEINSTANCE);
    if (FAILED(hr = joystick->GetDeviceInfo(&info)))
    {
        return hr;
    }
    int i = 0;
    while (i < MAX_PATH && info.tszProductName[i] != 0)
    {
        std::cout << (char)info.tszProductName[i];
        i++;
    }
    std::cout << std::endl;
    system("pause");

    while (1)
    {
        poll(&js);

        if (js.rgbButtons[0] != 0)

            clickMouse();

        else
            unclickMouse();
        //clickMouse(js.rgbButtons[0]);

        for (int i = 0; i < 11; i++)
        {
            if (js.rgbButtons[i] != 0) std::cout << "Przycisk " << i + 1 << std::endl;
        }


        std::cout << "X: " << js.lX << std::endl;
        std::cout << "Y: " << js.lY << std::endl;
        std::cout << "Z: " << js.lZ << std::endl;

        moveMouse(js.lX, js.lY);
        printf("A\n");

        //Sleep(400);
        std::cout << std::endl;
        system("cls");
    }

    close();

    system("pause");
}
};

操作系统为windows 7 ultimate x32bit,用visual studio c++ 2013编译

Error message: Error 1 error C2065: 'Joy' : undeclared identifier c:\users\amidisglobal\documents\visual studio 2013\projects\test_joyconcolse\testjoyconsole\testjoyconsole\testjoyconsole.cpp 62 1 TestJoyConsole

Error 2 error C2065: 'q1' : undeclared identifier c:\users\amidisglobal\documents\visual studio 2013\projects\test_joyconcolse\testjoyconsole\testjoyconsole\testjoyconsole.cpp 62 1 TestJoyConsole

Error 3 error C2061: syntax error : identifier 'Joy' c:\users\amidisglobal\documents\visual studio 2013\projects\test_joyconcolse\testjoyconsole\testjoyconsole\testjoyconsole.cpp 62 1 TestJoyConsole

Error 4 error C2065: 'q1' : undeclared identifier c:\users\amidisglobal\documents\visual studio 2013\projects\test_joyconcolse\testjoyconsole\testjoyconsole\testjoyconsole.cpp 63 1 TestJoyConsole

Error 5 error C2227: left of '->start' must point to class/struct/union/generic type c:\users\amidisglobal\documents\visual studio 2013\projects\test_joyconcolse\testjoyconsole\testjoyconsole\testjoyconsole.cpp 63 1 TestJoyConsole

编辑:

//TestJoyConsole.cpp : 定义控制台应用程序的入口点。 //

#include "stdafx.h"
#include <iostream>
#include <cstdio>
#include <InitGuid.h>
#ifndef D_INPUT
#define D_INPUT
#define DIRECTINPUT_VERSION 0x0800
#include <dinput.h>
#endif

LPDIRECTINPUT8 di;
HRESULT hr;
LPDIRECTINPUTDEVICE8 joystick;
DIDEVICEINSTANCE pdidi;
DIDEVICEINSTANCE info;

BOOL CALLBACK
enumAxesCallback(const DIDEVICEOBJECTINSTANCE* instance, VOID* context)
{
HWND hDlg = (HWND)context;

DIPROPRANGE propRange;
propRange.diph.dwSize = sizeof(DIPROPRANGE);
propRange.diph.dwHeaderSize = sizeof(DIPROPHEADER);
propRange.diph.dwHow = DIPH_BYID;
propRange.diph.dwObj = instance->dwType;
propRange.lMin = -50;
propRange.lMax = +50;

if (FAILED(joystick->SetProperty(DIPROP_RANGE, &propRange.diph))) {
    return DIENUM_STOP;
}

return DIENUM_CONTINUE;
}

BOOL CALLBACK
enumCallback(const DIDEVICEINSTANCE* instance, VOID* context)
{
HRESULT hr;

hr = di->CreateDevice(instance->guidInstance, &joystick, NULL);

if (FAILED(hr)) {
    return DIENUM_CONTINUE;
}
return DIENUM_STOP;
}



class Joy
{
public:

HRESULT
    poll(DIJOYSTATE *js)
{
        HRESULT    hr;

        if (joystick == NULL)
        {
            return S_OK;
        }

        // Poll the device to read the current state
        hr = joystick->Poll();
        if (FAILED(hr)) {
            // DInput is telling us that the input stream has been
            // interrupted. We aren't tracking any state between polls, so
            // we don't have any special reset that needs to be done. We
            // just re-acquire and try again.
            hr = joystick->Acquire();
            while (hr == DIERR_INPUTLOST) {
                hr = joystick->Acquire();
            }

            // If we encounter a fatal error, return failure.
            if ((hr == DIERR_INVALIDPARAM) || (hr == DIERR_NOTINITIALIZED)) {
                return E_FAIL;
            }

            // If another application has control of this device, return successfully.
            // We'll just have to wait our turn to use the joystick.
            if (hr == DIERR_OTHERAPPHASPRIO) {
                return S_OK;
            }
        }
        // Get the input's device state
        if (FAILED(hr = joystick->GetDeviceState(sizeof(DIJOYSTATE), js))) {
            return hr; // The device should have been acquired during the Poll()
        }

        return S_OK;
    }
void GetDesktopResolution(int& horizontal, int& vertical)
{
    RECT desktop;

    // Get a handle to the desktop window
    const HWND hDesktop = GetDesktopWindow();

    // Get the size of screen to the variable desktop
    GetWindowRect(hDesktop, &desktop);

    horizontal = desktop.right;
    vertical = desktop.bottom;
}

void moveMouse(int dx, int dy)
{
    POINT pt;
    int horizontal = 0;
    int vertical = 0;

    GetDesktopResolution(horizontal, vertical);

    GetCursorPos(&pt);

    pt.x += dx;
    pt.y += dy;

    if (pt.x < 0)
    {
        pt.x = 0;
    }
    if (pt.x > horizontal)
    {
        pt.x = horizontal;
    }

    if (pt.y < 0)
    {
        pt.y = 0;
    }
    if (pt.y > vertical)
    {
        pt.y = vertical;
    }

    SetCursorPos(pt.x, pt.y);
}

void clickMouse()
{
    if (GetKeyState(VK_LBUTTON) >= 0)
    {
        mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
    }
}
void unclickMouse()
{
    mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
}

void close()
{
    if (joystick)
    {
        joystick->Unacquire();
    }
}

int start()
{
    DIJOYSTATE js;                                        // struktura stanu joysticka

    // Create a DirectInput device
    if (FAILED(hr = DirectInput8Create(GetModuleHandle(NULL), DIRECTINPUT_VERSION,
        IID_IDirectInput8, (VOID**)&di, NULL))) {
        return hr;
    }

    if (FAILED(hr = di->EnumDevices(DI8DEVCLASS_GAMECTRL, enumCallback,
        NULL, DIEDFL_ATTACHEDONLY))) {
        return hr;
    }

    // sprawdzenie czy jest joystick
    if (joystick == NULL) {

        std::cout << "Joystick not found.\n";
        system("pause");
        return E_FAIL;
    }

    // ustawienia
    DIDEVCAPS capabilities;

    // zdefiniowanie formatu danych urzadzenia
    if (FAILED(hr = joystick->SetDataFormat(&c_dfDIJoystick)))
    {
        return hr;
    }

    // Powiazanie urzadzenia z oknem aplikacji
    if (FAILED(hr = joystick->SetCooperativeLevel(GetConsoleWindow(), DISCL_NONEXCLUSIVE | DISCL_FOREGROUND))) {
        return hr;
    }

    // wczytanie ustawien joysticka
    capabilities.dwSize = sizeof(DIDEVCAPS);
    if (FAILED(hr = joystick->GetCapabilities(&capabilities))) {

        return hr;
    }

    // wyliczanie
    if (FAILED(hr = joystick->EnumObjects(enumAxesCallback, NULL, DIDFT_AXIS))) {
        return hr;
    }

    info.dwSize = sizeof(DIDEVICEINSTANCE);
    if (FAILED(hr = joystick->GetDeviceInfo(&info)))
    {
        return hr;
    }
    int i = 0;
    while (i < MAX_PATH && info.tszProductName[i] != 0)
    {
        std::cout << (char)info.tszProductName[i];
        i++;
    }
    std::cout << std::endl;
    system("pause");

    while (1)
    {
        poll(&js);

        if (js.rgbButtons[0] != 0)

            clickMouse();

        else
            unclickMouse();
        //clickMouse(js.rgbButtons[0]);

        for (int i = 0; i < 11; i++)
        {
            if (js.rgbButtons[i] != 0) std::cout << "Przycisk " << i + 1 << std::endl;
        }


        std::cout << "X: " << js.lX << std::endl;
        std::cout << "Y: " << js.lY << std::endl;
        std::cout << "Z: " << js.lZ << std::endl;

        moveMouse(js.lX, js.lY);
        printf("A\n");

        //Sleep(400);
        std::cout << std::endl;
        system("cls");
    }

    close();

    system("pause");
}
};



int _tmain(int argc, _TCHAR* argv[])
{

    int counter = 0;
    while (counter++ <= 100)
    {
        Joy* q1 = new Joy();
        q1->start();
        delete q1;

        system("PAUSE");
        return 0;
    }
}

现在得到错误 LNK2019:

错误 102 error LNK2019:未解析的外部符号 _DirectInput8Create@20 在函数“public: int __thiscall Joy::start(void)” (?start@Joy@@QAEHXZ) 中引用

错误 103 error LNK2001: 未解析的外部符号 _c_dfDIJoystick

错误 104 error LNK1120: 2 unresolved externals

最佳答案

您在尝试在 _tmain 中使用它之后声明了您的类 Joy。要么将定义移到前面,要么将声明移到头文件中,并将其包含在主 cpp 文件的顶部。

关于c++ - Visual Studio C++ 控制台操纵杆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30213184/

相关文章:

c++ - 减少 OCL 代码中的间接引用

c++ - 在 C++ 中将文件输入到多个数组

python - 迁移时 Django 错误(int() 和 datetime.datetime)

php - 在 VPS 服务器中运行 PHP 脚本 "forever"

C# 和 USB HID 设备

android - BroadcastReceiver 监控连接的特定 USB 设备

c++ - GNU C++ 和 Clang 中的模板实例化

c++ - 要解析为整数值的命令行参数

linux - 如何使用 brewperl 在 Ubuntu 上安装应用程序

android 在 USB Accessory 模式下无法接收 512bytes 的数据