2

我想使用 Synaptics SDK 来使用触摸板来捕获签名。我试图捕捉触摸的绝对 X 和 Y 位置,以便我可以跟踪人们抬起手指并将其放在其他地方。我知道我可以访问触摸板,因为我可以禁用它并访问触摸板的尺寸。

下一步是获取绝对 X 和 Y 坐标。根据Synaptics PS/2 触摸板接口指南(第 22 页),有一个“绝对模式”,我可以在其中获取此信息。到目前为止,我似乎无法访问它。我不知道如何将其设置为该模式。

我正在使用 C# 在 Visual Studio Express 2012 中进行开发。

另外,我似乎无法激活任何事件。我正在尝试注册这样的事件:

using SYNCOMLib;
using SYNCTRLLib;

SYNCTRLLib.SynAPICtrl SynAPICtrl1 = new SynAPICtrl();
SYNCTRLLib.SynDeviceCtrl SynDeviceCtrl1 = new SynDeviceCtrl();
SYNCTRLLib.SynDisplayCtrl SynDisplayCtrl1 = new SynDisplayCtrl();

SynAPICtrl1.OnNotify += SynAPICtrl1_OnNotify;
SynDeviceCtrl1.OnPacket += SynDeviceCtrl1_OnPacket;
SynDisplayCtrl1.OnMessage += SynDisplayCtrl1_OnMessage;

我有只将函数名称记录到控制台的函数:

private void SynDisplayCtrl1_OnMessage(SynDisplayMessage eMessage)
{
    Console.WriteLine("SynDisplayCtrl1_OnMessage");
}

private void SynAPICtrl1_OnNotify(SynNotificationReason eReason)
{
    Console.WriteLine("SynAPICtrl1_OnNotify");
}

private void SynDeviceCtrl1_OnPacket()
{
    Console.WriteLine("SynDeviceCtrl1_OnPacket");
}

这些函数都没有被调用(或者至少没有任何东西被记录在控制台中)。我对 Visual Studio 和 C# 相当陌生,所以解决方案可能是一个非常简单的修复。

提前致谢!

编辑: 这里是Synaptics SDK的链接,以备不时之需。

4

2 回答 2

1

我按照该站点上的信息并将其转换为以下 C#。

在我的代码顶部:

using SYNCOMLib;
using SYNCTRLLib;

在我的职能之外,所以它们是全球性的

SynAPICtrl SynTP_API = new SynAPICtrl();
SynDeviceCtrl SynTP_Dev = new SynDeviceCtrl();
SynPacketCtrl SynTP_Pack = new SynPacketCtrl();
int DeviceHandle;

在我的构造函数里面

SynTP_API.Initialize();
SynTP_API.Activate();
DeviceHandle = SynTP_API.FindDevice(new SynConnectionType(), new SynDeviceType(), 0);
SynTP_Dev.Select(DeviceHandle);
SynTP_Dev.Activate();  
SynTP_Dev.OnPacket += SynTP_Dev_OnPacket;

最后是处理事件的函数

private void SynTP_Dev_OnPacket()
{
    if (SynTP_Dev.LoadPacket(SynTP_Pack) == 1)
    {
        Console.WriteLine(SynTP_Pack.FingerState);
        Console.WriteLine(SynTP_Pack.X);
        Console.WriteLine(SynTP_Pack.Y);
    }
}

我将更改一些变量名称以使它们更直观,但这段代码工作得很好。

于 2013-05-08T16:18:59.623 回答
1

接受的答案在 Windows 10 上不起作用。这是一个更正的代码示例,演示了检测触控板上的三指点击。在接受的答案中检测绝对坐标的相同方法也可以在这里工作 - 但请注意 loadPacket() 将始终返回 0,而不是 1。

注意:您要检测的手势必须在 Synaptics 控制面板中启用。此外,由于 Synaptics SDK 似乎已脱机,因此我能够直接从 .NET 引用 C:\Windows\System32\SynCom.dll。

class Program
{
    static SynAPICtrl api = new SynAPICtrl();
    static SynDeviceCtrl device = new SynDeviceCtrl();
    static SynPacketCtrl packet = new SynPacketCtrl();
    static int deviceHandle;
    static int counter;

    static void Main(string[] args)
    {   
        api.Initialize();
        api.Activate();
        //select the first device found
        deviceHandle = api.FindDevice(SynConnectionType.SE_ConnectionAny, SynDeviceType.SE_DeviceTouchPad, -1);
        device.Select(deviceHandle);
        device.Activate();
        device.OnPacket += SynTP_Dev_OnPacket;
        Console.ReadLine();
    }

    static private void SynTP_Dev_OnPacket()
    {
        var result = device.LoadPacket(packet);
        SynFingerFlags fingerState;
        if(Enum.TryParse(packet.FingerState.ToString(), out fingerState))
        {
            if(fingerState.HasFlag(SynFingerFlags.SF_FingerTap3))
            {
                Console.WriteLine($"Tapped {counter++}");
            }
        }
    }
}
于 2016-05-30T05:29:27.000 回答