C# 键盘监视+剪切板编程(每次复制都不一样哦!*v*)

简介:

由来:
      前一段时间把收藏的google徽标都上传到博客上来,上传的时候发现不支持批量上传图片,而且上传的图片名称还不一样!!我靠!一百多张图片要弄到猴年马月才能上传完毕啊!!于是乎想办法偷懒:先下了一个批量更改文件名的工具,把图片通过改成了1~1百多.jpg,然后写了一个剪切板的程序来动态的更改每次复制的文件名,这样只需要每次CTRL+C然后点一下上传然后再CTRL+C点一下上传...
实现:
      先一股脑的把代码全帖上来,然后稍微讲解下:

using  System;
using  System.Collections.Generic;
using  System.Text;
using  System.Runtime.InteropServices;
using  System.Windows.Forms;
using  System.Diagnostics;

namespace  ClipboardEdit
{
    
public   class  InterceptKeys
    {
        
private   const   int  WH_KEYBOARD_LL  =   13 ;

        
private   const   int  WM_KEYDOWN  =   0x0100 ;

        
private   static  LowLevelKeyboardProc _proc  =  HookCallback;

        
private   static  IntPtr _hookID  =  IntPtr.Zero;

        /// <summary>
        
/// 启动监测程序
        
/// </summary>
        
public   static   void  RunHook()
        {
            _hookID 
=  SetHook(_proc);
        }

        /// <summary>
        
/// 关闭监测程序
        
/// </summary>
        
public   static   void  UnHook()
        {
            UnhookWindowsHookEx(_hookID);
        }

        
private   static  IntPtr SetHook(LowLevelKeyboardProc proc)
        {
            
using  (Process curProcess  =  Process.GetCurrentProcess())
            
using  (ProcessModule curModule  =  curProcess.MainModule)
            {
                
return  SetWindowsHookEx(WH_KEYBOARD_LL, proc,GetModuleHandle(curModule.ModuleName),  0 );
            }
        }

        
///   <summary>
        
///  设置默认值与数据
        
///   </summary>
        
///   <param name="initInt"></param>
        
///   <param name="outString"> "F:\图片\精品分类\品牌图片\google徽标\@_@.gif" </param>
         public   static   void  Init( int  initInt,  string  outString)
        {
            i 
=  initInt;
            str 
=  outString;
        }

        
private   static   int  i  =   0 ;
        
private   static   string  str  =   @" I:\over\Images\google\@_@.jpg " ;

        
private   static  IntPtr HookCallback( int  nCode, IntPtr wParam, IntPtr lParam)
        {
            
if  (nCode  >=   0   &&  wParam  ==  (IntPtr)WM_KEYDOWN)
            {
                
int  vkCode  =  Marshal.ReadInt32(lParam);
                Keys key
= (Keys)vkCode;
                
// 同时按下Ctrl+V键的时候
                 if  (Control.ModifierKeys  ==  Keys.Control  &&  key.Equals(Keys.V))
                {
                    
// 获得剪切板数据
                     string  data  =  Clipboard.GetText(TextDataFormat.UnicodeText);
                    
// 重新设置剪切板数据
                    DataObject m_data  =   new  DataObject();
                    m_data.SetData(DataFormats.Text, 
true , str.Replace( " @_@ " ,Convert.ToString( ++ i)));
                    Clipboard.SetDataObject(m_data, 
true );
                }
            }
            
return  CallNextHookEx(_hookID, nCode, wParam, lParam);
        }

        
#region  调用API

        
private   delegate  IntPtr LowLevelKeyboardProc( int  nCode, IntPtr wParam, IntPtr lParam);

        [DllImport(
" user32.dll " , CharSet  =  CharSet.Auto, SetLastError  =   true )]

        
private   static   extern  IntPtr SetWindowsHookEx( int  idHook,

        LowLevelKeyboardProc lpfn, IntPtr hMod, 
uint  dwThreadId);

        [DllImport(
" user32.dll " , CharSet  =  CharSet.Auto, SetLastError  =   true )]

        [
return : MarshalAs(UnmanagedType.Bool)]

        
private   static   extern   bool  UnhookWindowsHookEx(IntPtr hhk);

        [DllImport(
" user32.dll " , CharSet  =  CharSet.Auto, SetLastError  =   true )]

        
private   static   extern  IntPtr CallNextHookEx(IntPtr hhk,  int  nCode,

        IntPtr wParam, IntPtr lParam);

        [DllImport(
" kernel32.dll " , CharSet  =  CharSet.Auto, SetLastError  =   true )]

        
private   static   extern  IntPtr GetModuleHandle( string  lpModuleName);

        
#endregion
    } 
}

调用:

InterceptKeys.RunHook();

说明:
    其实光显示或改变剪切板里面的数据没有这么多代码的,这里启动键盘监测程序,只有按下CTRL+C改会改变剪切板中的数据,像[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]这样的代码都是引入DLL,调用系统API用于监测键盘事件的。

本文转自博客园农民伯伯的博客,原文链接:C# 键盘监视+剪切板编程(每次复制都不一样哦!*v*),如需转载请自行联系原博主。

目录
相关文章
|
4月前
|
开发框架 前端开发 .NET
C#编程与Web开发
【4月更文挑战第21天】本文探讨了C#在Web开发中的应用,包括使用ASP.NET框架、MVC模式、Web API和Entity Framework。C#作为.NET框架的主要语言,结合这些工具,能创建动态、高效的Web应用。实际案例涉及企业级应用、电子商务和社交媒体平台。尽管面临竞争和挑战,但C#在Web开发领域的前景将持续拓展。
157 3
|
4月前
|
SQL 开发框架 安全
C#编程与多线程处理
【4月更文挑战第21天】探索C#多线程处理,提升程序性能与响应性。了解C#中的Thread、Task类及Async/Await关键字,掌握线程同步与安全,实践并发计算、网络服务及UI优化。跟随未来发展趋势,利用C#打造高效应用。
173 3
|
3月前
|
编译器 API C#
技术心得记录:深入分析C#键盘勾子(Hook)拦截器,屏蔽键盘活动的详解
技术心得记录:深入分析C#键盘勾子(Hook)拦截器,屏蔽键盘活动的详解
|
9天前
|
图形学 C# 开发者
全面掌握Unity游戏开发核心技术:C#脚本编程从入门到精通——详解生命周期方法、事件处理与面向对象设计,助你打造高效稳定的互动娱乐体验
【8月更文挑战第31天】Unity 是一款强大的游戏开发平台,支持多种编程语言,其中 C# 最为常用。本文介绍 C# 在 Unity 中的应用,涵盖脚本生命周期、常用函数、事件处理及面向对象编程等核心概念。通过具体示例,展示如何编写有效的 C# 脚本,包括 Start、Update 和 LateUpdate 等生命周期方法,以及碰撞检测和类继承等高级技巧,帮助开发者掌握 Unity 脚本编程基础,提升游戏开发效率。
24 0
|
1月前
|
存储 C#
揭秘C#.Net编程秘宝:结构体类型Struct,让你的数据结构秒变高效战斗机,编程界的新星就是你!
【8月更文挑战第4天】在C#编程中,结构体(`struct`)是一种整合多种数据类型的复合数据类型。与类不同,结构体是值类型,意味着数据被直接复制而非引用。这使其适合表示小型、固定的数据结构如点坐标。结构体默认私有成员且不可变,除非明确指定。通过`struct`关键字定义,可以包含字段、构造函数及方法。例如,定义一个表示二维点的结构体,并实现计算距离原点的方法。使用时如同普通类型,可通过实例化并调用其成员。设计时推荐保持结构体不可变以避免副作用,并注意装箱拆箱可能导致的性能影响。掌握结构体有助于构建高效的应用程序。
48 7
|
22天前
|
安全 C# 开发者
【C# 多线程编程陷阱揭秘】:小心!那些让你的程序瞬间崩溃的多线程数据同步异常问题,看完这篇你就能轻松应对!
【8月更文挑战第18天】多线程编程对现代软件开发至关重要,特别是在追求高性能和响应性方面。然而,它也带来了数据同步异常等挑战。本文通过一个简单的计数器示例展示了当多个线程无序地访问共享资源时可能出现的问题,并介绍了如何使用 `lock` 语句来确保线程安全。此外,还提到了其他同步工具如 `Monitor` 和 `Semaphore`,帮助开发者实现更高效的数据同步策略,以达到既保证数据一致性又维持良好性能的目标。
25 0
|
3月前
|
存储 C# 开发者
C# 编程基础:注释、变量、常量、数据类型和自定义类型
C# 编程基础:注释、变量、常量、数据类型和自定义类型
|
4月前
|
存储 安全 网络安全
C#编程的安全性与加密技术
【4月更文挑战第21天】C#在.NET框架支持下,以其面向对象和高级特性成为安全软件开发的利器。本文探讨C#在安全加密领域的应用,包括使用System.Security.Cryptography库实现加密算法,利用SSL/TLS保障网络传输安全,进行身份验证,并强调编写安全代码的重要性。实际案例涵盖在线支付、企业应用和文件加密,展示了C#在应对安全挑战的同时,不断拓展其在该领域的潜力和未来前景。
238 5
|
4月前
|
存储 算法 C#
C#编程与数据结构的结合
【4月更文挑战第21天】本文探讨了C#如何结合数据结构以构建高效软件,强调数据结构在C#中的重要性。C#作为面向对象的编程语言,提供内置数据结构如List、Array和Dictionary,同时也支持自定义数据结构。文章列举了C#实现数组、链表、栈、队列等基础数据结构的示例,并讨论了它们在排序、图算法和数据库访问等场景的应用。掌握C#数据结构有助于编写高性能、可维护的代码。
40 3