我想使用Synaptics SDK使用触控板捕获签名。我试图捕捉触摸的绝对X和Y位置,以便我可以跟踪人们举起手指并将其放在其他地方。我知道我可以访问触控板,因为我可以禁用它并访问触控板的尺寸。
下一步是获得绝对的X和Y坐标。根据{{3}}(第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 PS/2 TouchPad Interfacing Guide的链接,以备不时之需。
答案 0 :(得分:1)
我按照this site上的信息将其转换为以下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);
}
}
我要更改一些变量名称以使它们更直观,但这段代码运行得很好。
答案 1 :(得分: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++}");
}
}
}
}