前幾天在網上看到有個軟件叫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就可以輕松一次性把系列號填寫完。好的創意往往是成功的一半!