当前位置: 首页 > 编程日记 > 正文

快速设置戴尔latitude笔记本的触摸板和指点杆

// TouchPadSettings.cpp : Defines the entry point for the console application.
// by windviki 2010/08/31
// 转载请注明出处。
//
// 办公用的戴尔笔记本除了触摸板,还在键盘中间有一个指点杆(point stick)
// 打字很不习惯,经常会碰到。于是想禁用掉这个指点杆。发现自带的设置软件需要.Net4环境支持。
// 折腾完之后成功禁用。但是很郁闷的发现设置无法保存,重启之后指点杆又启用了。
// 于是祭起windbg,得到一些参数值,写了一个小程序来实现快速禁用或者开启触摸板/指点杆。设为开机启动便解决了这个问题。
// 以下提供两种方法。第一种是直接用deviceiocontrol进行操作,第二种是调用其设置所用的dll导出的函数。
// 至于官方控制程序无法保存设置的问题,现在发现可能是系统启动的时候没有正确的从注册表里面读取设置并应用到设备上所致。
// 能否直接修改官方程序,留待后面有空研究。

#include "stdafx.h"
#include <Windows.h>

int _tmain(int argc, _TCHAR* argv[])
{
    //直接和驱动通信
    HANDLE hApfilter = ::CreateFile(
        _T("\\\\.\\Apfiltr"), //设备名
        GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 
        NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    if (hApfilter == INVALID_HANDLE_VALUE)
    {
        DWORD dwErr = ::GetLastError();
        return -1;
    }
    // 111111
    // 123456
    // 1:touchpad buttons enable 
    // 2,6:touchpad enable 
    // 3:stick buttons enable 
    // 4,5:stick enable

    //char szInput[6] = {0x00, 0x00, 0x28, 0x00, 0x00, 0x00/*, 0x20, 0x00*/}; //全禁
    //char szInput[6] = {0x00, 0x00, 0x3f, 0x00, 0x00, 0x00/*, 0x15, 0x00*/}; //全开
    char szInput[6] = {0x00, 0x00, 0x28, 0x00, 0x00, 0x00};
    char szOutput[2] = {0};
    DWORD dwReturned = 0;
    if(!DeviceIoControl(hApfilter, 0xd82625b8, szInput, 6, szOutput, 2, &dwReturned, NULL))
    {
        //
    }
    ::CloseHandle(hApfilter);
    return 0;

    //--------------------------------------------------------------------------------------------------------------------------------
    //依靠Vxdif.dll的导出函数
    // export functions
    typedef DWORD (__stdcall *IOCTL_DisableTouchpad)(INT dwDevSelect);
    typedef DWORD (__stdcall *IOCTL_EnableWheel)(USHORT Param1);
    typedef DWORD (__stdcall *IOCTL_GetDeviceID)(DWORD hWnd, INT& dwDeviceID, INT nBuffSize);
    typedef DWORD (__stdcall *IOCTL_GetDeviceType)(DWORD hWnd, INT& dwDeviceType, INT nBuffSize);
    typedef DWORD (__stdcall *IOCTL_SelectDevice)(INT dwDevSelect);
    typedef DWORD (__stdcall *IOCTL_SetButtonEventMask)(INT dwDevSelect);
    typedef DWORD (__stdcall *IOCTL_SetButtonFunction)(DWORD hWnd, INT Param2);
    typedef DWORD (__stdcall *IOCTL_SetCornerTapOffset)(DWORD hWnd, USHORT Param2, USHORT Param3);
    typedef DWORD (__stdcall *IOCTL_SetSpeed)(DWORD hWnd, INT Param2, INT Param3);
    typedef DWORD (__stdcall *IOCTL_SetSPHwTapping)(INT Param1);
    typedef DWORD (__stdcall *IOCTL_SetSPTapSettings)(INT Param1);
    typedef DWORD (__stdcall *IOCTL_SetTapSettings)(DWORD hWnd, BYTE Param2);
    typedef DWORD (__stdcall *IOCTL_SetTouchSensitivity)(INT Param1);
    typedef DWORD (__stdcall *IOCTL_Tapping)(DWORD hWnd, INT Param2);

    HINSTANCE hVxDif = ::LoadLibrary(_T("Vxdif.dll"));

    IOCTL_DisableTouchpad pfIOCTL_DisableTouchpad = (IOCTL_DisableTouchpad)GetProcAddress(hVxDif, "IOCTL_DisableTouchpad");
    IOCTL_EnableWheel pfIOCTL_EnableWheel = (IOCTL_EnableWheel)GetProcAddress(hVxDif, "IOCTL_EnableWheel");
    IOCTL_GetDeviceID pfIOCTL_GetDeviceID = (IOCTL_GetDeviceID)GetProcAddress(hVxDif, "IOCTL_GetDeviceID");
    IOCTL_GetDeviceType pfIOCTL_GetDeviceType = (IOCTL_GetDeviceType)GetProcAddress(hVxDif, "IOCTL_GetDeviceType");
    IOCTL_SelectDevice pfIOCTL_SelectDevice = (IOCTL_SelectDevice)GetProcAddress(hVxDif, "IOCTL_SelectDevice");
    IOCTL_SetButtonEventMask pfIOCTL_SetButtonEventMask = (IOCTL_SetButtonEventMask)GetProcAddress(hVxDif, "IOCTL_SetButtonEventMask");
    IOCTL_SetButtonFunction pfIOCTL_SetButtonFunction = (IOCTL_SetButtonFunction)GetProcAddress(hVxDif, "IOCTL_SetButtonFunction");
    IOCTL_SetCornerTapOffset pfIOCTL_SetCornerTapOffset = (IOCTL_SetCornerTapOffset)GetProcAddress(hVxDif, "IOCTL_SetCornerTapOffset");
    IOCTL_SetSpeed pfIOCTL_SetSpeed = (IOCTL_SetSpeed)GetProcAddress(hVxDif, "IOCTL_SetSpeed");
    IOCTL_SetSPHwTapping pfIOCTL_SetSPHwTapping = (IOCTL_SetSPHwTapping)GetProcAddress(hVxDif, "IOCTL_SetSPHwTapping");
    IOCTL_SetSPTapSettings pfIOCTL_SetSPTapSettings = (IOCTL_SetSPTapSettings)GetProcAddress(hVxDif, "IOCTL_SetSPTapSettings");
    IOCTL_SetTapSettings pfIOCTL_SetTapSettings = (IOCTL_SetTapSettings)GetProcAddress(hVxDif, "IOCTL_SetTapSettings");
    IOCTL_SetTouchSensitivity pfIOCTL_SetTouchSensitivity = (IOCTL_SetTouchSensitivity)GetProcAddress(hVxDif, "IOCTL_SetTouchSensitivity");
    IOCTL_Tapping pfIOCTL_Tapping = (IOCTL_Tapping)GetProcAddress(hVxDif, "IOCTL_Tapping");

    if (pfIOCTL_SelectDevice)
    {
        pfIOCTL_SelectDevice(0x3f); //全开

        //pfIOCTL_SelectDevice(0x28); //全禁止
    }

    ::FreeLibrary(hVxDif);

    return 0;
}


Published by Wiz


转载于:https://www.cnblogs.com/windviki/archive/2011/08/31/2160957.html

相关文章:

Ubuntu 10.10系统安装手记

原来一直在公司用Ubuntu&#xff0c;感觉做开发是相当不错的&#xff0c;特别那种各种利用命令的方式真是太高效了。所以现在想把笔记本也装上&#xff0c;弄了半天&#xff0c;也遇到不少问题&#xff0c;记下来备忘一下。 虚拟机还是双系统 磁盘里面好多东西&#xff0c;基本…

php值传参,引用传参以及对象传参

传值&#xff1a;是把实参的值赋值给行参 &#xff0c;那么对行参的修改&#xff0c;不会影响实参的值传引用 &#xff1a;真正的以地址的方式传递参数传递以后&#xff0c;行参和实参都是同一个对象&#xff0c;只是他们名字不同而已对行参的修改将影响实参的值说明&#xff1…

用一行代码高效的求一个列表的平方和

最近看到一个笔试题&#xff0c;考察的都是 Python 中的高阶函数 题目如下&#xff1a;用一行代码高效的求一个列表的平方和(不能用 sum 函数) 分析 1.先将列表中每个值作平方&#xff1a; 立即想到 map 函数&#xff0c;假设列表是 range(10)&#xff0c;那么这个列表中平方是…

【java】第二十二节课(HashSet)

1、使用HashSet建立对象、添加元素并使用两种方法遍历 代码实现 public class SetDemo {public static void main(String[] args) {Set<String> set new HashSet();set.add("猴子");set.add("八戒");set.add("唐僧");set.add("沙僧…

转:在 .NET 中实现异步回调访问数据库

在 .NET 中实现异步回调访问数据库 时间:2009-11-17 19:52来源:网络收集 作者:佚名 点击: 334 次 技术论坛某些场合下&#xff0c;在对数据库进行访问时&#xff0c;为了避免同步访问数据时所带来的延迟&#xff0c;我们需要改进设计&#xff0c;以提高程序执行效率。一方面&am…

《资安人》:迈向成功SOC之路

近日&#xff0c;台湾的《资安人》上发表了一篇文章——《迈向成功的SOC之路》&#xff0c;现转载至此&#xff0c;以飨读者。【作者&#xff1a;王榮信 -11/08/2010】在現代虛擬世界中&#xff0c;造成資訊安全事件的來源為病毒、蠕蟲或木馬&#xff0c;不變的安全事件來源就是…

Laravel 上使用 phpexcel的两种方式

原创 2017年06月24日 20:24:311229文章采集与网上 方式1。使用原生的phpexcel &#xff0c; http://blog.csdn.net/CSwfe/article/details/52748046?locationNum1 1、在app目录下创建一个新的文件夹&#xff0c;命名libs&#xff08;可自定义&#xff09; app/libs/phpExcel2…

剑指offer-----Python-----栈

用两个栈实现队列 题目&#xff1a;用两个栈来实现一个队列&#xff0c;完成队列的Push和Pop操作。队列中元素为int类型. 首先&#xff0c;栈都是先进后出&#xff0c;但是队列呢&#xff0c;一般是先进先出。也就是创建两个栈stack1和stack2&#xff0c;使用两个“先进后出”的…

【工具软件】markdown编译器待办事项无法打勾

使用时可以直接点击上方工具栏的 List item 注意&#xff1a;此时已经自动在里面加了一个空格&#xff0c;如果直接加x的话&#xff0c;不会打勾&#xff0c;如下&#xff1a;[ x] List item 所以先删除空格在加x 问题解决

【转】创建不可见的Activity

在android开发中有时候会用到一些后台的Activity&#xff0c;但又不适合使用service&#xff0c;比如直接点击程序图标时只是执行一段代码&#xff0c;不需要弹出程序界面。此时可以在项目的AndroidManifest.xml文件中相应的Activity标签中添加这样一行&#xff1a;android:the…

关于 TApplication 详解 三 ---- TComponent

ComponentCount属性 对应对象&#xff1a;所有组件 声明&#xff1a;property ComponentCount: Integer; 功能&#xff1a;此属性在运行时有效&#xff0c;它是只读型。同时它标明组件具有的组件数。当用户在设计时可以在窗体上放置一个组件&#xff0c;因此此窗体将变为…

[转载] K3 K3c 最简单无损开壳方法

只用一把螺丝刀就行了&#xff0c;其它什么撬棒 信用卡 撬片等 拆机工具一概不用。拆了5台&#xff0c;只有一台断了一个扣口。1. 把底部4个螺丝拿掉。2.把路由如图放在桌子上&#xff0c;路由平行于身体&#xff0c;注意是立着放 使路由与桌子接触的部分成30度角。这样使一侧…

图像处理随笔知识

采样频率&#xff1a; 采样频率是指1s内采样的次数&#xff0c;反映了采样点之间的间隔大小。 采样频率越高&#xff0c;得到的图像样本越逼真&#xff0c;图像质量越高&#xff0c;但要求的存储量也越大。 图像量化&#xff1a; 要用多大范围的数值来表示图样采样之后的每一个…

一则android软件开发工程师的招聘信息

岗位职责&#xff1a; 从事Android平台的客户端软件开发 任职资格&#xff1a; 1、一年以上Android平台开发经验&#xff1b; 2、两年以上Java开发经验&#xff1b; 3、熟悉Android开发架构和API调用&#xff1b; 4、熟悉HTTP、TCP/IP通讯协议&#xff1b; 5、熟悉面向对象编程…

【数据库】数据库基本操作

操作练习&#xff1a; 创建数据库 删除数据库 修改数据库配置 创建数据表 修改表结构 ———————————— 添加字段 修改字段 重命名字段 更改主键 删除字段 ———————————— 重命名表名 删除表 截断表 表数据的操作 添加数据 修改数据 删除数…

USERADD命令详解

2019独角兽企业重金招聘Python工程师标准>>> 1.作用useradd命令用来建立用户帐号和创建用户的起始目录&#xff0c;使用权限是终极用户。2.格式useradd [&#xff0d;d home] [&#xff0d;s shell] [&#xff0d;c comment] [&#xff0d;m [&#xff0d;k templat…

tensorflow入门(二)

import numpy as np import tensorflow as tf import matplotlib.pyplot as plt#使用numpy生成200个随机点 x_data np.linspace(-0.5,0.5,200)[:,np.newaxis] noise np.random.normal(0,0.02,x_data.shape) y_data np.square(x_data) noise#定义两个placeholder x tf.plac…

DRF序列化和反序列化

一、自定义序列化组件 新建一个任意名的py文件&#xff0c;里面导入serlizerfrom rest_framework import serializers自定义一个类继承serializers&#xff0c;里面写需要序列化的字段方法一&#xff1a;继承serializers.Serializerclass BookSerlizer(serializers.Serializer)…

设计模式学习笔记-中介模式

概述&#xff1a; 用中介对象来封装一系列的对象交互。中介者使各对象不需要显示地相互引用&#xff0c;从而使其耦合松散&#xff0c;而且可以对立地改变他们之间的…

【数据库】兴唐第二十七节课之jdbc的使用

使用jdbc修改数据库表中的信息 package java27practice;import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement;public class JDBCDemo {public static void main(String[] args) {Connection conn null;Stat…

windows 2008 R2无法创建性能收集器

问题&#xff1a; 检查排除方法&#xff1a; 1.确保用户有权限 Http://technet.microsoft.com/zh-cn/library/cc749154(WS.10).aspx &#xff08;参考&#xff1a; 2.确保 Distributed Transaction Coordinator服务 及Task Scheduler服务有启动。 3.检查 C:\Windows\System32\T…

Silverlight WCF RIA服务(二十三)Silverlight 客户端 4

DomainDataSource WCF RIA Services提供DomainDataSource控件来简化用户界面和域上下文中数据的交互。通过DomainDataSource&#xff0c;我们可以只是用声明性语法来检索、编辑数据。我们指定域上下文与DomainDataSource一起使用&#xff0c;然后通过这个上下文来调用操作。Dom…

Storm Trident示例function, filter, projection

以下代码演示function, filter, projection的使用&#xff0c;可结合注释 省略部分代码&#xff0c;省略部分可参考&#xff1a;https://blog.csdn.net/nickta/article/details/79666918 FixedBatchSpout spout new FixedBatchSpout(new Fields("user", "score…

解决 sh: java: command not found 问题

在执行脚本上加入如下配置即可#!/bin/bashJAVA_HOME/usr/java/jdk1.8.0_152export PATH$PATH:$JAVA_HOME/bin转载于:https://www.cnblogs.com/jimw/p/11126437.html

【数据库】 兴唐第二十七节课只sql注入

首先来一个用户登录程序 public static void login(String username, String password) {Connection conn null;Statement stat null;ResultSet rs null; try {Class.forName("com.mysql.jdbc.Driver");String url "jdbc:mysql://127.0.0.1:3306/tyrantfor…

SIEM部署的几条最佳实践

2010年11月12号&#xff0c;NetworkWorld发表了一篇文章——《SIEM部署的最佳实践》&#xff0c;业界同仁给出了他的一些建议。 这些建议主要是针对Verizon2010年的那个DBIR报告中提到的日志缺失造成的严重问题。 至于建议&#xff0c;主要有&#xff1a; 1&#xff09;先要搞明…

ffmpeg解码视频存为BMP文件

ffmpeg解码视频存为BMP文件 分类&#xff1a; ffmpeg2011-07-28 12:13 8人阅读 评论(0) 收藏 举报view plain#include <windows.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #pragma once #ifdef __cplusplus extern …

(四)Asp.net web api中的坑-【api的返回值】

&#xff08;四&#xff09;Asp.net web api中的坑-【api的返回值】 原文:&#xff08;四&#xff09;Asp.net web api中的坑-【api的返回值】void无返回值IHttpActionResultHttpResponseMessage自定义类型我这里并不想赘述这些返回类型&#xff0c; 可以参考博文http://blog.c…

如何提高编程能力?

其实很多人学编程都会遇到困难&#xff0c;我觉得其中一个根本原因是他们没搞明白学编程到底是学什么。编程不是一种知识&#xff0c;而是一门手艺。我们从小到大的学习都是学习知识&#xff0c;流程一般是课前看书预习&#xff0c;上课听讲&#xff0c;下课做作业&#xff0c;…

【HTML】兴唐第二十八节课之初识HTML

1、HTML&#xff1a;hyper text markup language&#xff08;超级文本标记语言&#xff09;算编程&#xff0c;但HTML不是编程语言 2、注意&#xff1a; &#xff08;1&#xff09;所有的HTML文件都是以.html或者htm作为扩展名 &#xff08;2&#xff09;html文件需要被浏览…