如何屏蔽鍵盤的輸入
各位大俠:
我目前有一個程序,鍵盤和掃描儀都通過鍵口同電腦相連,而程序現在要做到一個判斷,只能接收掃描儀掃到的數據,如果是鍵盤輸入的數據則不接受,請問這個功能可不可以實現啊,各位請幫忙啊
问题点数:100、回复次数:18Top
1 楼loomman(一剑)回复于 2006-08-31 09:11:06 得分 0
键盘钩子,这里有例子:
http://www.czvc.com/down.asp?id=104Top
2 楼netliuming(你有安全感吗?)回复于 2006-08-31 09:25:17 得分 20
楼上的是关于vc,只要将数据区定义按下面修改,一样可以适用于bcb
//定义一个全局数据区
#pragma option -zRSHSEG //缺省数据段
#pragma option -zTSHCLASS//缺省数据库类名
#include <windows.h>
//共享
int shareint = 0;
//创建一个与项目同名的def文件,在.def文件中声明这个数据区 即加上下面一行,然后将文件添加到工程中)
SEGMENTS SHSEG CLASS 'SHCLASS' SHARED
//对于BCB,为什么这么实现DLL中直接定义共享内存块可参考下面:
http://community.borland.com/article/0,1410,20008,00.html
///
C++Builder 4.0 is the first C++Builder compiler that supports shared memory segments.
This document explains how to use this feature in windows DLL.
To change the data segment and the class name, you need to add
#pragma option -zR[SEGMENT NAME] and
#pragma option -zT[CLASS NAME] to the file you want the data shared from.
Below is the source file I am going to export the integer named 'data':
File: SharedData.cpp
//---------------------------------------------------------------------------
// Borland C++Builder
// Copyright (c) 1987, 1999 Inprise Corporation. All Rights Reserved.
//---------------------------------------------------------------------------
#pragma option -zRSHSEG // change default data segment name
#pragma option -zTSHCLASS // change default data class name
// Here is the initialized data that will be shared.
int data = 0;
Notice that the segment name for this file is: SHSEGSHCLASS. A .def file
is required for the linker to create the shared segement. Below is what the
.def file looks like:
File: Shared.def
LIBRARY SHAREDDLL
SEGMENTS
SHSEG CLASS 'SHCLASS' SHARED
Top
3 楼i_love_pc(杰子)(欢迎加入技术交流QQ群:23640432)回复于 2006-08-31 09:36:44 得分 0
学习。Top
4 楼keiy()回复于 2006-08-31 10:09:41 得分 20
大部分键盘接口式读卡器是通过硬件模拟键盘信号的,所以与键盘发出的信息是一样的,软件无法区分,即使你用键盘钩子,也无法实现(如:你屏蔽了键盘的'1'键,同样将屏蔽读卡器的'1'键)Top
5 楼linglingchen()回复于 2006-08-31 10:37:02 得分 0
是啊,我也覺得有這個問題存在,因為鍵盤和掃描儀都是通過PS2的鍵盤插孔的,哎,看來只能通過輸入數據的時間長短來判斷了,因為掃描儀輸入的時間比較短,而用鍵盤手動輸入的時間比較久,以此來區別是那個輸入的,不知道各位還有什么高見啊Top
6 楼netliuming(你有安全感吗?)回复于 2006-08-31 18:53:49 得分 0
有道理,顶一个Top
7 楼CsharpGame(现为菜鸟)回复于 2006-08-31 19:15:40 得分 0
通过时间长短判断是个可行的法子,不过楼主为何要限制用键盘输入呢?Top
8 楼pilixuanke(轩客)回复于 2006-08-31 20:07:11 得分 0
输入时间长短?那扫描仪停止工作,过3秒钟(或更长时间)又开始工作,怎么区分呀?Top
9 楼jaffy(小胖猫^_^笨猫先飞)回复于 2006-09-01 09:10:41 得分 0
我以前也遇到过这个问题,结果后来到应用的时候也没解决,只好换了个USB口的扫描仪Top
10 楼linglingchen()回复于 2006-09-01 09:11:30 得分 0
我這個只是程序的需要,在一個文本框中輸入數據,怕用鍵盤操作有誤,所以限制只能用掃描儀,不過現在還有另外一個問題,我想不能讓文本框中的內容不允許從別的地方粘貼過來,也就是不能用鍵盤的ctrl+V以及鼠標的粘貼功能,是不是有個系統的剪切板,我只要清除剪切板上的內容,就可以做倒了,就是現在不知道如何清除系統剪切板的內容,請問各位有什么高見啊Top
11 楼CsharpGame(现为菜鸟)回复于 2006-09-01 13:05:04 得分 0
防止键盘输入错误你可以用加验证码的方式实现呀,用扫描仪输入也不一定保证完全不出错的。Top
12 楼netliuming(你有安全感吗?)回复于 2006-09-01 13:11:33 得分 0
把文本框属性设为只读就可以了吧,不用那么麻烦。Top
13 楼linglingchen()回复于 2006-09-01 13:26:59 得分 0
誰能告訴我,如何清除剪切板的內容啊Top
14 楼MEFULEU(没有作不到,只有想不到)回复于 2006-09-01 17:23:13 得分 30
Clipboard()->Clear();Top
15 楼truelove7283159(大头娃娃http://traversite.blog.sohu.com)回复于 2006-09-06 11:36:08 得分 10
1
①使用未公开API:BlockInput,
就是使用BlockInput(true)/ BlockInput(false)进行锁住键盘鼠标。
②然后再屏蔽Ctrl + Alt + Del等键,就是重写一个msgina.dll。
=======================
交互式的登陆支持是由WinLogon调用GINA DLL实现的,GINA DLL提供了一个交互式的界面为用户登陆提供认证请求。在WinLogon初始化时,就向系统注册截获CTRL+ALT+DEL消息,所以其他程序就无法得到CTRL+ALT+DEL的消息。
WinLogon会和GINA DLL进行交互,缺省是MSGINA.DLL(在System32目录下)。微软同时也为我们提供的接口,自己
可以编GINA DLL来代替MSGINA.DLL。
2
可以用鼠标和键盘的过滤驱动. 偶有DDK改天下去看看,赫赫:)
Top
16 楼MEIYOUZHEGEYONGHUMIN()回复于 2006-09-14 22:10:23 得分 0
我遇到类似的问题;
http://community.csdn.net/Expert/topic/5002/5002956.xml?temp=.2620355
查资料
http://windowssdk.msdn.microsoft.com/en-us/library/ms674827.aspx
但是我的环境目前不是xp...
不知道谁能做好后,分享一下,谢谢Top
17 楼xt_xiaotian(笑天)回复于 2006-10-09 20:41:56 得分 20
在窗口过程中加入一下代码.
case WM_KEYDOWN:
case WM_SYSKEYDOWN:
case WM_KEYUP:
case WM_SYSKEYUP:
case WM_CHAR:
case WM_SYSCHAR:
case WM_DEADCHAR:
case WM_SYSDEADCHAR:
return 0;
上面的代码表明,你自己的程序接收所有的键盘消息(不让系统处理),然后忽略掉。Top
18 楼wewaa(C/C++)回复于 2007-01-04 17:58:25 得分 0
markTop




