草庐IT

c++ - 带有原始输入的精密触摸板的 X 和 Y 坐标

coder 2024-06-07 原文

背景

我正在尝试在 Win10 中使用 C++ 从精密触摸板获取触摸坐标,程序在后台运行。


研究

Rawinput可以在后台获取数据。

我可以从 microsoft 中获取具有这些使用 ID 和页面的数据:

Member  Description                         Page    ID      Mandatory/Optional
X       X coordinate of contact position    0x01    0x30    Mandatory for T Optional for C
Y       Y coordinate of contact position    0x01    0x31    Mandatory for T Optional for C

我可以把他们两个和HIDP_functions放在一起,来自this answer .


代码

case WM_INPUT: {
    UINT dwSize;
    GetRawInputData((HRAWINPUT)lParam, RID_INPUT, NULL, &dwSize, sizeof(RAWINPUTHEADER));
    LPBYTE lpb = new BYTE[dwSize];
    if (lpb == NULL) {
        return 0;
    }
    RAWINPUT* raw = (RAWINPUT*)lpb;
    GetRawInputDeviceInfo(raw->header.hDevice, RIDI_PREPARSEDDATA, NULL, &dwSize);
    PHIDP_PREPARSED_DATA preparsedData = (PHIDP_PREPARSED_DATA)HeapAlloc(GetProcessHeap(), 0, dwSize);
    GetRawInputDeviceInfo(raw->header.hDevice, RIDI_PREPARSEDDATA, preparsedData, &dwSize); 

    HIDP_CAPS caps;
    HidP_GetCaps(preparsedData, &caps);
    USHORT capsLength = caps.NumberInputValueCaps;
    PHIDP_VALUE_CAPS valueCaps = (PHIDP_VALUE_CAPS)HeapAlloc(GetProcessHeap(), 0, capsLength*sizeof(HIDP_VALUE_CAPS));

    HidP_GetValueCaps(HidP_Input, valueCaps, &capsLength, preparsedData);
    for (int i=0; i < capsLength; i++) {
        CHAR value;
        USHORT valuelength = valueCaps[i].BitSize * valueCaps[i].ReportCount;
        HidP_GetUsageValueArray (HidP_Input, valueCaps[i].UsagePage, 0, valueCaps[i].NotRange.Usage, &value, valuelength, preparsedData, (PCHAR)raw->data.hid.bRawData, raw->data.hid.dwSizeHid);
        std::cout << valueCaps[i].UsagePage << "  " << valueCaps[i].NotRange.Usage <<std::endl;
        std::cout << value << std::endl;

        switch(valueCaps[i].NotRange.Usage) {
            case 0x30:    // X-axis
                std::cout << "X: " << value << std::endl;
                break;

            case 0x31:    // Y-axis
                std::cout << "y: " << value << std::endl;
                break;
        }
    }

}

问题

我编译了代码并触摸了我的触摸板,但所有的输出都是:

0  0
³

我做错了什么吗?有人知道吗?

最佳答案

一个包含最小 Contact ID、x、y、Contact、Scan 的数据包可能包含多个 Contact ID、x、y 三元组用于多个点,然后必须使用 来自 valueCaps[] 数组的 valueCaps[i].LinkCollection,它从 1 增加最多 5 个点。

HidP_GetUsageValue
(
    HidP_Input, 
    valueCaps[i].UsagePage, 
    valueCaps[i].LinkCollection, //** !!!!!
    valueCaps[i].NotRange.Usage, 
    &value, 
    preparsedData, 
    (PCHAR)raw->data.hid.bRawData, 
    raw->data.hid.dwSizeHid
);

如果 valueCaps[i].UsagePage = 1 且坐标在数组中 valueCaps[i].NotRange.Usage = 0x30 (x), valueCaps[i].NotRange.Usage = 0x30 (y)

很重要的是valueCaps[i]数组中的xLogicalMin, yLogicalMin, xLogicalMax, yLogicalMax

    xLogicalMin = valueCaps[i].LogicalMin;
    xLogicalMax = valueCaps[i].LogicalMax;
    xPhysicalMin = valueCaps[i].PhysicalMin;
    xPhysicalMax = valueCaps[i].PhysicalMax;

所有分配的空间必须正确释放!!!!!

按下触摸板的 оп 周边点可启动多项功能,或像华硕 NumberPad 一样按触摸板上的网格单元也具有有限的电容式和有源笔功能,单指轻弹,沿触摸板的四个边移动以进行滚动/缩放,移动用一根手指移动光标并单击,按下,按下加移动, 双击,单击加按第二根手指。两个手指的操作计数在坐标附近或远处的手指空间增加。通过“扫描”中的坐标、时间和“联系”中的联系人,可以访问触摸板上所有可能的复杂手势。

关于c++ - 带有原始输入的精密触摸板的 X 和 Y 坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47005610/

有关c++ - 带有原始输入的精密触摸板的 X 和 Y 坐标的更多相关文章

  1. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  2. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  3. ruby-on-rails - 带有 Zeus 的 RSpec 3.1,我应该在 spec_helper 中要求 'rspec/rails' 吗? - 2

    使用rspec-rails3.0+,测试设置分为spec_helper和rails_helper我注意到生成的spec_helper不需要'rspec/rails'。这会导致zeus崩溃:spec_helper.rb:5:in`':undefinedmethod`configure'forRSpec:Module(NoMethodError)对thisissue最常见的回应是需要'rspec/rails'。但这是否会破坏仅使用spec_helper拆分rails规范和PORO规范的全部目的?或者这无关紧要,因为Zeus无论如何都会预加载Rails?我应该在我的spec_helper中做

  4. ruby - 如何计算 Liquid 中的变量 +1 - 2

    我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我

  5. ruby - 鸭子输入字符串、符号和数组的优雅方式? - 2

    这是针对我无法破坏的现有公共(public)API,但我确实希望对其进行扩展。目前,该方法采用字符串或符号或任何其他在作为第一个参数传递给send时有意义的内容我想添加发送字符串、符号等列表的功能。我可以只使用is_a吗?数组,但还有其他发送列表的方法,这不是很像ruby​​。我将调用列表中的map,所以第一个倾向是使用respond_to?:map。但是字符串也会响应:map,所以这行不通。 最佳答案 如何将它们全部视为数组?String的行为与仅包含String的Array相同:deffoo(obj,arg)[*arg].eac

  6. Ruby:如何使用带有散列的 'send' 方法调用方法? - 2

    假设我有一个类A,里面有一些方法。假设stringmethodName是这些方法之一,我已经知道我想给它什么参数。它们在散列中{'param1'=>value1,'param2'=>value2}所以我有:params={'param1'=>value1,'param2'=>value2}a=A.new()a.send(methodName,value1,value2)#callmethodnamewithbothparams我希望能够通过传递我的哈希以某种方式调用该方法。这可能吗? 最佳答案 确保methodName是一个符号,而

  7. ruby-on-rails - 带有 Pry 的 Rails 控制台 - 2

    当我进入Rails控制台时,我已将pry设置为加载代替irb。我找不到该页面或不记得如何将其恢复为默认行为,因为它似乎干扰了我的Rubymine调试器。有什么建议吗? 最佳答案 我刚发现问题,pry-railsgem。忘记了它的目的是让“railsconsole”打开pry。 关于ruby-on-rails-带有Pry的Rails控制台,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/question

  8. 带有 attr_accessor 的类上的 Ruby instance_eval - 2

    我了解instance_eval和class_eval之间的基本区别。我在玩弄时发现的是一些涉及attr_accessor的奇怪东西。这是一个例子:A=Class.newA.class_eval{attr_accessor:x}a=A.newa.x="x"a.x=>"x"#...expectedA.instance_eval{attr_accessor:y}A.y="y"=>NoMethodError:undefinedmethod`y='forA:Classa.y="y"=>"y"#WHATTT?这是怎么回事:instance_eval没有访问我们的A类(对象)然后它实际上将它添加到

  9. arrays - Ruby 数组 += vs 推送 - 2

    我有一个数组数组,想将元素附加到子数组。+=做我想做的,但我想了解为什么push不做。我期望的行为(并与+=一起工作):b=Array.new(3,[])b[0]+=["apple"]b[1]+=["orange"]b[2]+=["frog"]b=>[["苹果"],["橙子"],["Frog"]]通过推送,我将推送的元素附加到每个子数组(为什么?):a=Array.new(3,[])a[0].push("apple")a[1].push("orange")a[2].push("frog")a=>[[“苹果”、“橙子”、“Frog”]、[“苹果”、“橙子”、“Frog”]、[“苹果”、“

  10. += 的 Ruby 方法 - 2

    有没有办法让Ruby能够做这样的事情?classPlane@moved=0@x=0defx+=(v)#thisiserror@x+=v@moved+=1enddefto_s"moved#{@moved}times,currentxis#{@x}"endendplane=Plane.newplane.x+=5plane.x+=10putsplane.to_s#moved2times,currentxis15 最佳答案 您不能在Ruby中覆盖复合赋值运算符。任务在内部处理。您应该覆盖+,而不是+=。plane.a+=b与plane.a=

随机推荐