ImageVerifierCode 换一换
格式:DOCX , 页数:27 ,大小:30.71KB ,
资源ID:30309572      下载积分:10 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/30309572.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(整理的一些关于C#的文章希望能对大家有所帮助.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

整理的一些关于C#的文章希望能对大家有所帮助.docx

1、整理的一些关于C#的文章希望能对大家有所帮助整理的一些关于C#的文章,希望能对大家有所帮助.1:C#+低级Windows API钩子拦截键盘输入摘要在家里,婴儿和其它动物可能会重击你的计算机键盘,致使出现各种无法预言的结果。本文中的这个C#示例应用程序将向你展示如何基于Windows钩子API来实现在击键造成任何危害之前捕获它们。一. 简介猫和婴儿有很多共同之处。他们都喜欢吃家中养植的植物,都非常讨厌关门。他们也都爱玩弄你的键盘,结果是,你正发送给你的老板的电子邮件可能是以半截句子发送出去的,你的Excel帐户也被加入了一些乱七八糟的内容,并且你还没有注意到,当打开Windows资源管理器时,

2、若干文件已经被移到了回收站!其解决方案是,开发一个应用程序实现如下功能:只要键盘处于威胁状态你就可以进行切换,并确保任何键盘输入活动都不会造成危害。本文想展示如何使用一种低级Windows API钩子在一个C#应用程序中实现键盘控制。下图是本文示例程序的一个运行快照。二. 背景其实,已经存在许多有关于Windows钩子的文章和示例代码,并且已经有人编写过与本文几乎一样的C+示例程序。然而,当我搜索相应的C#应用程序的源码时,却找到极少的.NET示例,而且没有一个程序能够提供一个方便的自包含的C#类。.NET框架能够使你以托管方式来存取你最常使用的键盘事件(通过KeyPress,KeyUp和Ke

3、yDown)。遗憾的是,这些事件都不能被用来停止Windows组合键(如Alt+Tab或Windows开始键),从而允许用户远离某一个应用程序。本文的想法在操作系统级上捕获键盘事件而不是通过框架级来实现。为此,应用程序需要使用Windows API函数来把它自身添加到应用程序钩子链中以监听来自操作系统的键盘消息。当它收到这种类型的消息时,该应用程序能够选择性地传递消息,或者进行正常处理,或者镇压它以便不再有其它应用程序(包括Windows)来影响它。本文正是想解释其实现机理。然而,请注意,本文中的代码仅适用于基于NT版本的Windows(NT,2000和XP),并且无法使用这个方法来停用Ctr

4、l+Alt+Delete。有关于如何实现这一点,你可以参考MSDN有关资料。三. 使用代码为了易于使用,我在本文中提供了两个独立的zip文件。一个仅包含KeyboardHook类,这是本文介绍的重点。另一个是一个完整的微软Visual C# 2005 Express Edition应用程序工程,名叫Baby Keyboard Bash,它实现显示击键的名字或彩色的形状以响应于击键。四. 实例化类键盘钩子是通过keyboard.cs中的KeyboardHook类来建立和管理的。这个类实现了IDisposable接口,因此,实例化它的最简单的方法是在应用程序的Main()方法中使用using关键字

5、来封装Application.Run()调用。这将确保只要该应用程序开始即建立钩子并且,更重要的是,当该应用程序结束时立即使这个钩子失效。这个类引发一个事件来警告应用程序已经有键被按下,因此主表单能够存取在Main()方法中创建的KeyboardHook实例就显得非常重要;最简单的方法是把这个实例存储在一个公共成员变量中。KeyboardHook提供了三种构造器来启用或禁用某些设置: KeyboardHook():捕获所有击键,没有任何内容传递到Windows或另外的应用程序。 KeyboardHook(string param):把参数串转换为Parameters枚举中的值之一,然后调用下面

6、的构造器: KeyboardHook(KeyboardHook.Parameters enum):根据从Parameters枚举中选择的值的不同,分别启动下列设置:o Parameters.AllowAltTab:允许用户使用Alt+Tab切换到另外的应用程序。o Parameters.AllowWindowsKey:允许用户使用Ctrl+Esc或一种Windows键存取任务栏和开始菜单。o Parameters.AllowAltTabAndWindows:启用Alt+Tab,Ctrl+Esc和Windows键。o Parameters.PassAllKeysToNextApp:如果该参数为t

7、rue,那么所有的击键将被传递给任何其它监听应用程序(包括Windows)。当击键继续被键盘钩子捕获时,启用Alt+Tab和/或Windows键允许实际使用该计算机者切换到另一个应用程序并且使用鼠标与之交互。PassAllKeysToNextApp设置有效地禁用了击键捕获;这个类也是建立一个低级键盘钩子并且引发它的KeyIntercepted事件,但是它还负责把键盘事件传递到另一个监听程序。因此,实例化该类以捕获所有击键的方法如下:public static KeyboardHook kh;STAThreadstatic void Main()/其它代码using (kh = new Keyb

8、oardHook()Application.Run(new Form1();五. 处理KeyIntercepted事件当一外键被按下时,这个KeyboardHook类激活一个包含一些KeyboardHookEventArgs的KeyIntercepted事件。这是通过一个KeyboardHookEventHandler类型的方法使用以下方式来实现的:kh.KeyIntercepted += new KeyboardHook.KeyboardHookEventHandler(kh_KeyIntercepted);这个KeyboardHookEventArgs返回关于被按下键的下列信息: KeyN

9、ame:键名,通过把捕获的键代码强制转换为System.Windows.Forms.Keys而获得。 KeyCode:由键盘钩子返回的原来的键代码 PassThrough:指出是否这个KeyboardHook实例被配置以允许该击键传递到其它应用程序。如果你想允许一用户使用Alt+Tab或 Ctrl+Esc/Windows键切换到其它的应用程序的话,那么对之进行检查是很有用的。然后,使用一个具有适当签名的方法来执行击键所调用的任何任务。下面是一个示例片断:void kh_KeyIntercepted(KeyboardHookEventArgs e)/检查是否这个键击事件被传递到其它应用程序并且停

10、用TopMost,以防他们需要调到前端if (e.PassThrough)this.TopMost = false;ds.Draw (e.KeyName);本文的剩下部分将解释低级键盘钩子是如何在KeyboardHook中实现的。六. 实现一个低级Windows API键盘钩子在user32.dll中,Windows API包含三个方法来实现此目的: SetWindowsHookEx,它负责建立键盘钩子 UnhookWindowsHookEx,它负责移去键盘钩子 CallNextHookEx,它负责把击键信息传递到下一个监听键盘事件的应用程序创建一个能够拦截键盘的应用程序的关键是,实现前面两个

11、方法,而放弃第三个。结果是,任何击键都只能传递到这个应用程序中。为了实现这一目标,第一步是包括System.Runtime.InteropServices命名空间并且导入API方法,首先是SetWindowsHookEx:using System.Runtime.InteropServices./在类内部:DllImport( user32.dll, CharSet = CharSet.Auto, SetLastError = true)private static extern IntPtr SetWindowsHookEx(int idHook,LowLevelKeyboardProc l

12、pfn, IntPtr hMod, uint dwThreadId);导入UnhookWindowsHookEx和CallNextHookEx的代码请见后面的讨论。下一步是调用SetWindowsHookEx来建立钩子,这时需要传递下列四个参数: idHook:这个数字决定了要建立的钩子的类型。例如,SetWindowsHookEx可以被用于钩住鼠标事件(当然还有其它事件)。在本文情况下,我们仅对13有兴趣,这是键盘钩子的id。为了使代码更易读些,我们把它赋值给一个常数WH_KEYBOARD_LL。 Lpfn:这是一个指向函数的长指针,该函数将负责处理键盘事件。在C#中,指针是通过传递一个代理

13、类型的实例而获得的,从而使之引用一个适当的方法。这是我们在每次使用钩子时所调用的方法。这里值得注意的是,这个代理实例需要被存储于这个类的一个成员变量中。这是为了防止一旦第一个方法调用结束它会被作为垃圾回收。 hMod:建立钩子的应用程序的一个实例句柄。我找到的绝大多数实例仅把它设置为IntPtr.Zero,理由是不大可能存在该应用程序的多个实例。然而,这部分代码使用了来自于kernel32.dll的GetModuleHandle来标识准确的实例从而使这个类更具灵活性。 dwThreadId:当前进程的id。把它设置为0可以使这个钩子成为全局构子,这是相应于一个低级键盘钩子的正确设置。SetWi

14、ndowsHookEx返回一个钩子id,这个id将被用于当应用程序结束时从钩子链中脱钩,因此它需要存储在一个成员变量中以备将来使用。KeyboardHook类中的相关代码如下:private HookHandlerDelegate proc;private IntPtr hookID = IntPtr.Zero ;private const int WH_KEYBOARD_LL = 13;public KeyboardHook()proc = new HookHandlerDelegate(HookCallback);using (Process curProcess = Process.Ge

15、tCurrentProcess()using (ProcessModule curModule = curProcess.MainModule)hookID = SetWindowsHookEx(WH_KEYBOARD_LL, proc,GetModuleHandle(curModule.ModuleName), 0);七. 处理键盘事件如前面所提及,SetWindowsHookEx需要一个到被用来处理键盘事件的回调函数的指针。它期望有一个使用如下签名的函数:LRESULT CALLBACK LowLevelKeyboardProc( int nCode,WPARAM wParam,LPARA

16、M lParam);其实,建立一个函数指针的C#方法使用了一个代理,因此,向SetWindowsHookEx指出它需要的内容的第一步是使用正确的签名来声明一个代理:private delegate IntPtr HookHandlerDelegate(int nCode, IntPtr wParam, ref KBDLLHOOKSTRUCT lParam);然后,使用相同的签名编写一个回调方法;这个方法将包含实际上处理键盘事件的所有代码。在KeyboardHook的情况下,它检查是否击键应该被传递给其它应用程序并且接下来激发KeyIntercepted事件。下面是一个简化版本的不带有击键处理代

17、码的情况:private const int WM_KEYDOWN = 0x0100;private const int WM_SYSKEYDOWN = 0x0104;private IntPtr HookCallback(int nCode, IntPtr wParam, ref KBDLLHOOKSTRUCT lParam)/仅为KeyDown事件过滤wParam,否则该代码将再次执行-对于每一次击键(也就是,相应于KeyDown和KeyUp)/WM_SYSKEYDOWN是捕获Alt相关组合键所必需的if (nCode = 0 & (wParam = (IntPtr)WM_KEYDOWN

18、| wParam = (IntPtr)WM_SYSKEYDOWN)/激发事件OnKeyIntercepted(new KeyboardHookEventArgs(lParam.vkCode, AllowKey);/返回一个哑值以捕获击键return (System.IntPtr)1;/事件没有被处理,把它传递给下一个应用程序return CallNextHookEx(hookID, nCode, wParam, ref lParam);接下来,一个到HookCallback的参考被指派给HookHandlerDelegate的一个实例并且被传递到SetWindowsHookEx的调用,正如前一

19、节所展示的。无论何时一个键盘事件发生,下列参数将被传递给HookCallBack: nCode:根据MSDN文档,回调函数应该返回CallNextHookEx的结果,如果这个值小于零的话。正常的键盘事件将返回一个大于或等于零的nCode值。 wParam:这个值指示发生了什么类型的事件:键被按下还是松开,以及是否按下的键是一个系统键(左边或右边的Alt键)。 lParam:这是一个存储精确击键信息的结构,例如被按键的代码。在KeyboardHook中声明的这个结构如下:private struct KBDLLHOOKSTRUCTpublic int vkCode;int scanCode;pu

20、blic int flags;int time;int dwExtraInfo;其中的这两个公共参数是在KeyboardHook中的回调方法所使用的仅有的两个参数。vkCoke返回虚拟键代码,它能够被强制转换为System.Windows.Forms.Keys以获得键名,而flags显示是否这是一个扩展键(例如,Windows Start键)或是否同时按下了Alt键。有关于Hook回调方法的完整代码展示在每一种情况下要检查哪些flags值。如果flags提供的信息和KBDLLHOOKSTRUCT的其它组成元素不需要,那么这个回调方法和代码的签名可以按如下进行修改:private delegat

21、e IntPtr HookHandlerDelegate(int nCode, IntPtr wParam, IntPtr lParam);在这种情况中,lParam将仅返回vkCode。八. 把击键传递到下一个应用程序一个良好的键盘钩子回调方法应该以调用CallNextHookEx函数并且返回它的结果结束。这可以确保其它应用程序能够有机会处理针对于它们的击键。然而,KeyboardHook类的主要功能在于,阻止击键被传播到任何其它更多的应用程序。因此它无论在何时处理一次击键,HookCallback都将返回一个哑值:return (System.IntPtr )1;另一方面,它确实调用Cal

22、lNextHookEx-如果它不处理该事件,或如果重载的构造器中的使用KeyboardHook传递的参数允许某些组合键通过。CallNextHookEx被启用-通过从user32.dll导入该函数,如下列代码所示:DllImport(user32.dll, CharSet = CharSet.Auto, SetLastError = true)private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode,IntPtr wParam, ref KeyInfoStruct lParam);然后,被导入的方法被HookCallMe

23、thod所调用,这可以确保所有的通过钩子接收到的参数被继续传递到下一个应用程序中:CallNextHookEx(hookID, nCode, wParam, ref lParam);如前面所提及,如果在lParam中的flags是不相关的,那么可以修改导入的CallNextHookEx的签名以把lParam定义为System.IntPtr 。九. 移去钩子处理钩子的最后一步是使用从user32.dll中导入的UnhookWindowsHookEx函数移去它(当破坏KeyboardHook类的实例时),如下所示:DllImport(user32.dll, CharSet = CharSet.Au

24、to, SetLastError = true)return: MarshalAs(UnmanagedType.Bool)private static extern bool UnhookWindowsHookEx(IntPtr hhk);既然KeyboardHook实现IDisposable,那么这可以在Dispose方法中完成。public void Dispose()UnhookWindowsHookEx(hookID);hookID是构造器在调用SetWindowsHookEx所返回的id。这将从钩子链中删除应用程序。2:也说C#实现对Word文件读写2:也说C#实现对Word文件读写

25、手头上的一个项目报表相对比较简单,所以报表打印采用VBA引擎,通过定制Word模版,然后根据模版需要填充数据,然后OK,打印即可。实现方法:首先需要引用VBA组建,我用的是Office2003 Professional,Dll版本号为Microsoft Word11.0,另外当然还需要引用Interop.Word.Dll.代码如下:#region 打开Word文档,并且返回对象wDoc,wDoc / / 打开Word文档,并且返回对象wDoc,wDoc / / 完整Word文件路径+名称 / 返回的Word.Document wDoc对象 / 返回的Word.Application对象 pub

26、lic static void CreateWordDocument(string FileName,ref Word.Document wDoc,ref Word.Application WApp) if(FileName = ) return; Word.Document thisDocument = null; Word.FormFields formFields = null; Word.Application thisApplication = new Word.ApplicationClass(); thisApplication.Visible = true; thisAppli

27、cation.Caption = ; thisApplication.Options.CheckSpellingAsYouType = false; thisApplication.Options.CheckGrammarAsYouType = false; Object filename = FileName; Object ConfirmConversions = false; Object ReadOnly = true; Object AddToRecentFiles = false; Object PasswordDocument = System.Type.Missing; Obj

28、ect PasswordTemplate = System.Type.Missing; Object Revert = System.Type.Missing; Object WritePasswordDocument = System.Type.Missing; Object WritePasswordTemplate = System.Type.Missing; Object Format = System.Type.Missing ; Object Encoding = System.Type.Missing; Object Visible = System.Type.Missing;

29、Object OpenAndRepair = System.Type.Missing; Object DocumentDirection = System.Type.Missing; Object NoEncodingDialog = System.Type.Missing; Object XMLTransform = System.Type.Missing; try Word.Document wordDoc = thisApplication.Documents.Open(ref filename, ref ConfirmConversions, ref ReadOnly, ref Add

30、ToRecentFiles, ref PasswordDocument, ref PasswordTemplate, ref Revert,ref WritePasswordDocument, ref WritePasswordTemplate, ref Format, ref Encoding, ref Visible, ref OpenAndRepair, ref DocumentDirection, ref NoEncodingDialog, ref XMLTransform ); thisDocument = wordDoc; wDoc = wordDoc; WApp = thisApplication; formFields = wordDoc.FormFields; catch(Exception ex) MessageBox.Show(ex.Message); #endregion调用上面静态方法,打开目标文件并且把DataGrid中数据填充到对应Word标签中去#reg

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1