打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
C# 键盘监视+剪切板编程
C# 键盘监视+剪切板编程
前一段时间把收藏的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用于监测键盘事件的。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
常用Win32API封装Win32apifor.net
C# 区分键盘和红外线扫描枪输入 模拟扫描枪
常用Win32API 封装 Win32api for .net
C#+API实现指定窗体激活
c# 调用API访问其他窗体上的文本和执行单击事件等等
C# 实现会定时关闭的弹出对话框
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服