主页 PC知识 网管技术 黑客帝国 安全技术 开放系统 程序设计 搜索 技术论坛

 

相关联接
 
RHU本级分类

编程语言
程序代码
WIN/*NIX编程
其他类别
JAVA专区

 
RHU阅读排行
·在LinuxShell程序中进行身份验证
·截获流经本机网卡的IP数据包
·枚举进程和杀进程的小工具
·从蓝屏最小的asp木马来看C/S木马的编写
·用tc+iptables+HTB解决ADSL宽带速度瓶颈技术
·通过 Visual C++ 的编程模型和编译器优化增强您的应用程序
·Windows管道技术简述
·利用键盘钩子开发按键发音程序
·一个Linux病毒原型分析
·XP终端服务远程登录批处理

 
 
RHU最新文章
·Webshell下破解计算机管理员密码
·打造XP下可运行的微型PE文件(292字节)
·Win32平台下的Rootkit习作
·Linux如何在系统运行过程中修改内核参数
·Shell编程:Linux系统环境程序设计之路
·汇编创建简单的窗口
·深入浅出Win32多线程程序设计之线程控制
·VC实现Win2000下屏蔽Ctrl+Alt+Del键
·隐藏任意进程 目录/文件 注册表 端口
·Windows 的多线程程序设计初步 

 
 
RHU相关搜索









 
 
RHU广而告之

 
 
>您的位置:首页 -> 程序设计 -> WIN/*NIX编程
VC编写简单的序列号(SN)填写器

作者:RHU-TAC编辑员 来自:RHU网络采集 时间:2005-5-7 双击滚屏 收藏本页 字体:


点击 查看RHU2004全年文章


前几天在网上看到有个软件叫SNCopy,用来辅助填写系列号(SN)的。创意觉得还是挺好的。装软件的时候经常要填写系列号,而很多系列号都要分节来填写,没法用Ctrl+C和Ctrl+V(复制和粘贴)来一次性搞定,只能分节的复制和粘贴,很是麻烦。SNCopy就是来帮我们解决这个问题的。感觉这个不是很难做,就是从剪贴板上获取整个系列号,然后进行分解,依次填入即可。于是动手自己也做一个!

  一、建立一个基于对话框的应用程序 Snpaste(过程略)

  二、编写代码

  我们使用Shift+V作为快捷键,以此来快速地一次性地填写整个系列号。先进行热键的注册。在InitDialog()中添加如下代码:

if(!::RegisterHotKey(this->GetSafeHwnd(),0x3333,MOD_SHIFT,0x56))
{
 ::AfxMessageBox("热键注册失败!");
 this->CloseWindow();
}

  在程序退出前必须注销热键。在OnClose()中:

::UnregisterHotKey(this->GetSafeHwnd(),0x3333);

  响应热键:

LRESULT CsnpasteDlg::OnHotKey(WPARAM wParam,LPARAM lParam)
{
 if(!OpenClipboard())
 {
  ::AfxMessageBox("无法打开粘贴板!");
  return -1;
 }
 CString str=CString((char*)::GetClipboardData(CF_TEXT));
 CString oldstr=str;//保存原来的字串
 CloseClipboard();
 str.Trim();
 CString strtemp;
 int find_i=str.Find(''-'');
 if(find_i!=-1)//系列号中有“-”的,以此来划分系列号字串
 {
  while(find_i!=-1)
  {
   strtemp=str.Left(find_i);
   str=str.Mid(find_i+1);
   find_i=str.Find(''-'');
   Sleep(100);//由于剪贴板操作比较慢,必须加一定的延时,否则数据会出错。
   this->SendStrToClipboard(strtemp);//将分解得到的一小节字串复制到剪贴板
   this->PerformCtrlV();//模仿键盘击键Ctrl+V
   this->PerformClickTab();//模仿键盘击键Tab
  }
  if(!str.IsEmpty())
  {
   this->SendStrToClipboard(str);
   this->PerformCtrlV();
   this->PerformClickTab();
  }
 }
 else//系列号字串中没有“-”,有预先设定的长度来划分。
 { 
  while(!str.IsEmpty())
  {
   strtemp=str.Left(this->m_spinctrl.GetPos());
   str=str.Mid(this->m_spinctrl.GetPos());
   Sleep(100);
   this->SendStrToClipboard(strtemp);
   this->PerformCtrlV();
   this->PerformClickTab();
  }
 }
 Sleep(100);
 this->SendStrToClipboard(oldstr);//恢复原来剪贴板上的数据
 return 1;
}

  以下是键盘击键动作的模仿

void CsnpasteDlg::PerformCtrlV(void)
{
 ::keybd_event(VK_CONTROL,0,0,0);//按Ctrl,不放开
 ::keybd_event(0x56,0,0,0);//V key;再按V键不放开
 ::keybd_event(0x56,0,KEYEVENTF_KEYUP,0);//放开V键
 ::keybd_event(VK_CONTROL,0,KEYEVENTF_KEYUP,0);//放开Ctrl键
}
void CsnpasteDlg::PerformClickTab(void)
{
 ::keybd_event(VK_TAB,0,0,0);//按Tab键不放
 ::keybd_event(VK_TAB,0,KEYEVENTF_KEYUP,0);//放开Tab键
}

  以下是把字串送到剪贴板

void CsnpasteDlg::SendStrToClipboard(CString str)
{
 if(!OpenClipboard())
 {
  ::AfxMessageBox("无法打开粘贴板!");
  return ;
 }
 EmptyClipboard();//清空
 HGLOBAL hglo;
 hglo=GlobalAlloc(GPTR,str.GetLength()+1);//申请全局空间
 if(hglo==NULL)
 {
  ::AfxMessageBox("申请内存失败!");
  return ;
 }
 LPBYTE pbyte=(LPBYTE)GlobalLock(hglo);
 memcpy(pbyte,str.GetBuffer(),str.GetLength());
 str.ReleaseBuffer();
 GlobalUnlock(hglo);
 SetClipboardData(CF_TEXT,hglo);//将数据送到剪贴板
 CloseClipboard();
}

  三、程序运行

  程序在visual c++7.1上编译通过。界面如下:


图一 程序运行的界面

  只要将所要填写的系列号复制到剪贴板上,然后将光标放置在所要填写的位置,作用Shift+V就可以轻松一次性把系列号填写完。好的创意往往是成功的一半!


OVER

[1] 页 RedHyphone.Union 投稿邮箱
[特别声明]:
本站文章大多搜索转载自网络中,如果侵犯了您的权利,请告之我们。本站将立即删除。
本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
查看评论】【向上滚屏】【关闭窗口】【 打印
-相关文章
  • openSUSE 11.1 Final - 正式发布
  • [视频]Opera Mini 4.2 正式版发布
  • dll注入系统进程(开源代码)
  • 认知盲区 解惑双网卡双线路DNS解析
  • FlashFXP 简体中文版 3.7.5 Build 1303 Beta[烈火]
  • -文章评论 (关闭)
    ·还没有相关的评论!

    网上大名:
    红旋风网络技术联盟 RHUTech.Union
     
    Copyright © 2000-2007 RedHyphone.Union All Rights Reserved. 红旋风联盟版权所有.皖ICP备05011033号
    中国红旋风网络技术联盟 | www.RedHyphone.net
    Mailto:Redhyphone@gamil.com