最新评论
Re:C# 实现屏幕键盘 (ScreenKeyboard) newforestsky 2011-10-19 17:27
当关闭屏幕键盘时,出现瞬间卡死的情况。程序不错。
Re:C# 实现屏幕键盘 (ScreenKeyboard) hoodlum1980 2011-07-18 18:35
[quote]ols:
@hoodlum1980
非常支持你的说法[/quote]
谢谢,我觉得我也希望能给彼此大家都是非常信任的,但这源于每个作者对自己要求的高标准,即每个人都是对事不对人,每个人都用严谨的求是的态度研究技术。这样就会形成一个信任起点非常高的交流环境,在此完全可以相信每个人。但是我们目前的环境还不能达到这样。我也相信像持有“辰”这样对学习,引用,参考,原创新这些概念故意模糊和无所谓态度的人,是不太可能是一个认真做技术的人。我觉得遗憾,正是这样的人,甚至更恶劣的恶意抄袭(故意把别人的东西当作自己的东西发表)的人的存在,才使得我们彼此的信任度降低了。像他这种态度,哪么批评腾讯的抄袭就完全没有任何可能了,因为腾讯是抄袭和创新夹杂在一起的,即又他们的“微创新”的因素在里面。这样我们是不是就无法批判腾讯的抄袭,因为他有一些微创新,甚至还把产品质量提升到一个更高的高度。我看到很多博客的文章尾部都挂着一个版权声明,大概意识是可以转载,但请注明出处。相信大多数人都是希望自己的智慧的结晶能受到尊重,所以才这样要求。而我们希望别人对待自己如此的前提下,是不是对别人时也要保持一致呢。
好代码。给我很大帮助。
有个问题:
为什么在Win7下运行程序成功,但是屏幕键盘完全不起作用?
是Win7的Hook机制与Xp不一样吗?
不知有没有与我遇到相同问题的兄弟。
问题补充:
第一个问题已在上面的问答中找到答案:
buttonNameTextMaps.Add("btnMinus", "-");
buttonNameTextMaps.Add("btnEqual", "="); //插入此行
buttonNameTextMaps.Add("btnLBracket", "[");
首先感谢分享
其次提出两个问题:
1. “+/=”在上档键切换时,功能没有问题,但键盘上一直显示“=”,不显示“+”,这个问题不严重,应该是手误所致;
2. 在程序启动后,点击空格键或回车键时,程序占用CPU时间会变得很大,其它键还未发现这个问题。我本来想添加按键同时发声的功能,在ButtonOnClick事件中添加自定义发声函数(代码如下),测试时发现按空格键或回车键时,程序会不停的连续发声(程序运行后先按空格或回车键),其它键只发声一次。不知作者能否抽出时间来查证一下,最好能有解决办法。
再次感谢。
private void ButtonOnClick(object sender, EventArgs e) {
KeyboardButton btnKey = sender as KeyboardButton;
if (btnKey == null) {
return;
}
SendKeyCommand(btnKey);
Beep(); //我添加的发声函数,自定义,用PC喇叭发声
}
[quote]优哉@游哉:
@wsx_yusong
这时候你的输入控件没有焦点,你需要修改程序,注意切换焦点,通过使用 SendMessage或者直接调用 textBoxName.Foucus(), SendMessage方式可以避免频繁切换焦点产生的闪烁问题[/quote]
请问具体怎么实现。求代码。。。
我将上面说到的问题一的那个字典buttonNameTextMaps放到静态中去了,这样效率可能比较高一点。
private static readonly IDictionary<string, string> buttonNameTextMaps;
在静态构造函数中进行添加。
buttonNameTextMaps = new Dictionary<string, string>();
buttonNameTextMaps.Add("btnWave", "`");
buttonNameTextMaps.Add("btnMinus", "-");
buttonNameTextMaps.Add("btnEqual", "=");
buttonNameTextMaps.Add("btnLBracket", "[");
buttonNameTextMaps.Add("btnRBracket", "]");
buttonNameTextMaps.Add("btnPath", "\\");
buttonNameTextMaps.Add("btnSem", ";");
buttonNameTextMaps.Add("btnQute", "'");
buttonNameTextMaps.Add("btnComma", ",");
buttonNameTextMaps.Add("btnFullStop", ".");
buttonNameTextMaps.Add("btnDivide", "/");
还有,发现了另一个问题:
问题四:NumLock键无论有没有激活,按下小键盘的./Del键,效果都是出现一点“.”,而不是删除。
解决方法:在ReverseNumPad方法中将这句:
//this.btnNUMDot.VKCode = KeyboardConstaint.VK_OEM_PERIOD;
改成:
this.btnNUMDot.VKCode = KeyboardConstaint.VK_DELETE;//改正
希望作者可以改正一下,顺便看看问题二怎么解决。。。
发现了几个问题,
问题一:按SHIFT键的时候,“=”按钮(btnEqual)不会改变
解决办法:在主窗体的代码的SetButtonText();方法中将这句添加进去
[code=csharp]
buttonNameTextMaps.Add("btnEqual", "="); //添加(漏了一个)[
[/code]
再编译调试就可以看到Debug后的效果了。
问题二:
运行程序后,用鼠标点击一下Enter键后,将指针移动到其他按钮上,其他按钮不会改变颜色。
求解决方法:
问题三:
Shift键没有左右区分,例如调用系统的输入法的时候都是按照一个顺便去切换,而不能倒着过来切换。在实际键盘上操作就有区分了,WIN7的虚拟键盘也有区分。。。
另外说一下,这个工具挺不错的,谢谢楼主的代码。。。
Re:我的 WinClock 项目系列之一 (概述) hoodlum1980 2011-01-15 15:37
楼主的这个时钟做的是蛮漂亮的。效果很好。我记得很久以前我很喜欢用一款桌面时钟,应该是非托管代码开发的。楼主的时钟比我之前用的那款皮肤更多,功能也更全一些。应该说是一个很不错的软件。
Re:C# 实现屏幕键盘 (ScreenKeyboard) hoodlum1980 2011-01-15 15:07
@辰
今天我想起了这件事,回到这篇帖子,我又去你的博客上翻了下,发现你已写了40多页的博客,颇感震惊。我想既然大家都是研究技术,(可能还是热爱技术的),难道什么是基本的治学态度会不理解吗。我只想说要求是。我没有否定楼主的意思我已经强调了。但是你却认为我在说反话。我只想让楼主的帖子更严谨,这不是说你“隐藏”了你的引用代码来源,来博取牛人的虚荣。相反,如果你能做到求是,绝不会降低大家对作者水平的印象。你针对我的质问都是没有什么道理的。做技术需要踏实的精神,我想你应该能理解。假如说你引用了其他人的代码,你能在文中,代码中不声明原作者吗?我相信任何代码的原创作者都不会认可这种做法。这是治学态度的问题,不是我质疑谁的问题。你应该明白什么是原创,什么是受启发,什么是引用。你问我的12345那几个问题只能降低我对你个人水准和素质的印象,对于你这样的技术博客作者和态度,我感到很遗憾。
Re:C# 实现屏幕键盘 (ScreenKeyboard) hoodlum1980 2010-05-23 02:19
我不怎么在乎别人怎么看待这件事的,但是我自己一定会这样做。我看我和你就没必要在讨论下去了。到此为止吧。
@hoodlum1980
搞不懂,是你怎么凑巧,google了一些关键词,发现了核心的hook正好来自了codeproject。
为何不花多点时间,去研究下.net的核心库有多少来自java? 当年是MS买java版权,然后直接抄袭了java。
@hoodlum1980
1. 这里是写论文吗?
2. 你出生一刻开始,就自力更生,没有老师教、没有父母帮,活到这么大吗?
3. 你的电脑知识是怎么的凑巧,自己摸索出来,正好和现在主流一致吗?
4. 如果你有非常严谨的治学态度,麻烦以后你的所有blog全部注明引用。
5. 最后,写论文和写blog的区别在啥地方?
至于lz100%全局引用了nativeMethod等,没有注明,是lz的事情,后来也补登了。只是 有人 对一点点的问题就全盘否定,治学态度有待考究。
Re:C# 实现屏幕键盘 (ScreenKeyboard) hoodlum1980 2010-05-23 01:33
@辰
如果楼主没有参考过别人的东西,我收回我的言论。
如果参考过能不指明参考文献吗?你懂不懂最基本的治学态度!
@hoodlum1980
1. 你有没有看codeproject的源代码?
2. 你有没有看lz的源代码?
3. 你知道他们之间的差异没有?
Re:C# 实现屏幕键盘 (ScreenKeyboard) hoodlum1980 2010-05-23 01:23
[quote]辰:不错。不过看见有个叫xxx1980的在说反话,有点不爽。[/quote]
什么叫做反话?我对凡是不够严谨的现象都会严厉批评。看了你的回帖我很生气,我希望每个人都是非常和气的,但是前提是大家都非常严谨求是。否则我一定会继续让你不爽,永远是这样!
我新建了个解决方案,将虚拟键盘引入,并建了个新的页面,在页面中放了个文本框和两个按钮,一个是显示虚拟键盘,一个事确定,当单击显示虚拟键盘按钮时显示虚拟键盘,运行后,虚拟键盘显示了,但单击键盘,文本框中没有数字,但在外部,如文本文件又可以输入,我还把NativeMethods.SetWindowLong(this.Handle, KeyboardConstaint.GWL_EXSTYLE, (int)NativeMethods.GetWindowLong(this.Handle, KeyboardConstaint.GWL_EXSTYLE) | KeyboardConstaint.WS_DISABLED);
去掉了,可还不行,
请指教一下,小妹是个新手,谢谢!
不错。不过看见有个叫xxx1980的在说反话,有点不爽。
谢谢你的文章和代码,收获很大,虽然还没把握真谛,至少能模拟出来了,明白大概意思了.
关于你的屏幕键盘
看了你那篇文章,你那个按钮控件是怎么添加到工具箱里的?我看你没有建立控件库,是怎么做到的?
@wsx_yusong
这时候你的输入控件没有焦点,你需要修改程序,注意切换焦点,通过使用 SendMessage或者直接调用 textBoxName.Foucus(), SendMessage方式可以避免频繁切换焦点产生的闪烁问题
我下载了楼主的源代码,然后在同一个项目里又添加了一个窗体,在这窗体里有一个文本框,当文本框活动焦点时弹出楼主的屏幕键盘,为什么在这种情况下不能向文本框里输入文字呢?但向其他应用程序如记事本,IE等都可以输入。
Re:C# 实现自定义消息处理 yxlg 2009-08-08 16:27
好, 真好!顶
为什么在Vista 64 位系统上模拟不成功,用鼠标点没反应.
Re:C# 实现自定义消息处理 子逸 2009-07-17 15:48
这么好的文章尽然潜水的人这么多, 我顶你.
太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太漂亮了了,我以前也做过桌面时钟,只能换背景图片,看了你做的,真是太太太漂亮了。还有你那个桌面键盘,唉,没法跟你比呀。我最近做QQ呢,不会美工,只能全真模仿了。
强!!
“3.使用鼠标移动钟面。”
我以前见过的都是在C#里引用API,你写的这个才是正宗的C#代码,呵呵
好了,这下可以做病毒了,至少可以做个键盘监听器,偷个帐号什么的。
呵呵...
屏幕键盘最关键的东西就是2个:
一个是无焦点窗体:
NativeMethods.SetWindowLong(this.Handle, KeyboardConstaint.GWL_EXSTYLE,
12 (int)NativeMethods.GetWindowLong(this.Handle, KeyboardConstaint.GWL_EXSTYLE)
13 & (~KeyboardConstaint.WS_DISABLED));
另外一个就是按键发送
NativeMethods.SendInput((uint)input.Length, input, Marshal.SizeOf(input[0]))
另一个疑问
我的一个工程是用VC++ 开发的,想部分使用您的屏幕键盘的功能,比较好的方法是什么呢?
谢谢!
@yatany
从托管代码调用非常简单, 引用 HookEx.dll, 声明一个 filed:
private HookEx.UserActivityHook hook = new HookEx.UserActivityHook(false, false);
注册事件:
this.hook.KeyDown += HookOnGlobalKeyDown;
this.hook.KeyUp += HookOnGlobalKeyUp;
this.hook.MouseActivity += HookOnMouseActivity;
实现相应的处理.
void HookOnGlobalKeyDown(object sender, HookEx.KeyExEventArgs e) {
// TODO
}
......
请问如何从外部应用程序调用您的dll? yatany 2008-12-05 15:01
看了您的代码,特别感兴趣。
您把Hook的实现做到了dll中,并封装到类里面。
请问 我想从外部应用程序使用您dll中的方法,改如何调用呢?
@飞花浇叶
你可以看看源代码。
调用 Windows API SendInput 函数实现的, 也可以使用 keybd_event 函数
按下Shift->按下$对应键->弹起$对应键->弹起Shift 如果是英文输入状态就是一个 $, 只按 $ 应该是4.
实际上你不可能同时按下两个键的,总是会有先后顺序的。
C#中keysend的编写思路是什么?
我想用两个按钮
一个shift一个$
当我同时按SHIFT和$时就是$只按$时是一个4怎么办呢?
@优哉@游哉
这些技术因为是收费的,所以找不太到资料
不过还是谢谢楼主~
@Samson小天
我还没有这方面的资料,可以上网找下,一些第三方的产品,比如 QQ带有密码保护的键盘,银行的输入控件等都是不能被HOOK到的,不过好像这些保护程序是要收费的。
@金 刚
这种情况你不能直接使用这个程序, 你可以把键盘按键放到你的那个窗体上, 拷贝相应的代码就可以了。要注意的是点击按键时切换输入焦点,如果你无法得到你的输入控件的句柄,那么可以改造你的按键,不要使用CanFous为true的控件就可以了,比如直接继承Control。
@优哉@游哉
谢谢你!
可是我原来的窗体也是顶层窗体且全屏
我让我窗体获得焦点时你的这个键盘就不是顶层窗体啦,消失在后面,无法使用
这个问题怎么解决捏!
谢谢指教!
最近我想做一个比较安全的屏幕键盘,请问博主有什么方法能够让发出去的按键不被hook到么?
我试过.net自带的sendkeys还用过sendInput和keybd_event都会被键盘钩子拦截到
请问博主有什么好方法阻止这种情况么?
@金!刚
输入焦点如果在同一个窗体上, 实际上就不需要 Hook(当然用了也不会有问题), 去掉 OnLoad 里面的
NativeMethods.SetWindowLong(this.Handle, KeyboardConstaint.GWL_EXSTYLE, (int)NativeMethods.GetWindowLong(this.Handle, KeyboardConstaint.GWL_EXSTYLE) | KeyboardConstaint.WS_DISABLED);
语句。
同时在各个键的 KeyUp 事件中让输入控件 Focus 就可以了
谢谢!我也毕业设计也要用到这个东西
可是还有一个问题没有解决
焦点的获取和都是最顶层窗体怎么让他们互存
谢谢你的好东东 太阳之子601 2008-08-25 15:36
原来在delphi下编过一个模拟键盘,但在.net因为焦点问题一直没办法做
所以非常感谢。