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用于监测键盘事件的。

结束语:
      请把你所学的运用于生活,这样才会在快乐中学到东西,在学到东西的同时解决实际问题。按原来笨办法全部上传也用不了写这代码的时间的一半,但是你知道——我赚到了!!:)


转载:http://www.cnblogs.com/over140/archive/2007/11/05/934452.html

目录
相关文章
|
调度
MacBookPro外接显示器程序全屏状态,另一个显示器就黑屏
MacBookPro外接显示器程序全屏状态,另一个显示器就黑屏
614 0
MacBookPro外接显示器程序全屏状态,另一个显示器就黑屏
|
1月前
|
JSON 数据格式 Python
优秀!Python版按键精灵,电脑鼠标、键盘手势动作一键复制操作,优雅极了!
优秀!Python版按键精灵,电脑鼠标、键盘手势动作一键复制操作,优雅极了!
|
5月前
刚刚更新win11,记事本消失怎么处理?你需要注意些什么?
刚刚更新win11,记事本消失怎么处理?你需要注意些什么?
119 0
|
Windows
scrlk键是什么意思(电脑键盘每个按键的作用详细图解)
scrlk键是什么意思(电脑键盘每个按键的作用详细图解)
3115 0
|
Ubuntu Linux Windows
项目实战:Qt终端命令模拟工具 v1.0.0(实时获取命令行输出,执行指令,模拟ctrl+c中止操作)
在Qt软件中实现部分终端控制命令行功能,使软件内可以又好的模拟终端控制,提升软件整体契合度。
项目实战:Qt终端命令模拟工具 v1.0.0(实时获取命令行输出,执行指令,模拟ctrl+c中止操作)
c++【键盘读入操作】,两种方法做小游戏的控制摇杆
c++【键盘读入操作】,两种方法做小游戏的控制摇杆
c++【键盘读入操作】,两种方法做小游戏的控制摇杆
|
Windows
模拟鼠标键盘操作(硬件模拟)
3.驱动级模拟(硬件模拟)  如果上面的方法你都试过了,可是你发现目标程序却仍然顽固的不接受你模拟的消息,寒~~~~~~~~~还好,我还剩下最后一招,这就是驱动级模拟:直接读写键盘的硬件端口!  有一些使用DirectX接口的游戏程序,它们在读取键盘操作时绕过了windows的消息机制,而使用DirectInput.这是因为有些游戏对实时性控制的要求比较高,比如赛车游戏,要求以最快速度响应键盘输入。
4028 0
|
C语言
【C 语言】文件操作 ( 配置文件读写 | 框架搭建 | 主函数逻辑结构 | 启动无限循环 | 接收用户操作值 | 宏定义 | 显示操作菜单 )
【C 语言】文件操作 ( 配置文件读写 | 框架搭建 | 主函数逻辑结构 | 启动无限循环 | 接收用户操作值 | 宏定义 | 显示操作菜单 )
121 0
|
JavaScript
如何用 TypeScript 代码区分一个 button 动作是由键盘还是鼠标触发的
如何用 TypeScript 代码区分一个 button 动作是由键盘还是鼠标触发的
144 0
如何用 TypeScript 代码区分一个 button 动作是由键盘还是鼠标触发的
|
C# Windows
C# 程序关闭托盘图标不会自动消失
原文:C# 程序关闭托盘图标不会自动消失 c#程序关闭托盘图标不会自动消失,进程的托盘图标却不能随着进程的结束而自动消失  必须将鼠标移到图标上面时才能消失?  请问如何才能做到图标随着进程的结束而自动消失呢(外部强行结束,如在任务管理器将其结束), windows系统好多程序都会这样。
1206 0