更新日期:2011-1-23
测试环境:VS2008+WinXP
━━━━━━━━━━━━━━━━━━━━━━━━
/**************************************************************************** 函数CommentText() 可以注释不需要的字符串(即添加 /* */ )。 原理: 很简单。 1.模拟按键Ctrl+C 把选定文本放到剪贴板, 2.在程序里取出文本添加_T()。 3.再把文本放入剪贴板。 4.模拟按键Ctrl+V 粘贴文件。 方法一: 1.把以下代码粘贴到一个Win32工程里,编译链接生成一个exe程序。 2.运行程序会出项一个无焦点的按钮窗口(就像是浮动工具条) 3.选择要添加注释掉的字符串,单击按钮即可。 方法二:由于多了一个窗口,很不方便,你也可以把创建按钮窗口的代码去掉,直接在WinMain函数里添加AddTextMacro() 如下: int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) { CommentText() ; return false ; } 2.然后生成一个没有窗口的小程序.程序一运行就调用CommentText() 函数注释文本 3.在桌面为exe创建快捷方式,并右键-》属性-》添加快捷键。 4.操作时在IDE中选择文本,按快捷键就会调用exe,并对选择的文本进行注释。 方法三:我想是最好的方案了。 1.右键VC6工具栏-》自定义-》属性页选择“工具”-》新建一项工具,添加生成的exe程序。确定退出。 2.之后你可以在主菜单的工具里看到你添加的工具。 3.再右键VC6工具栏-》自定义-》属性页选择“命令”-》类别选择“工具”-》在右边按钮中会列 出所有工具。找到我们添加的那一项工具的按钮(按钮下标是1.2.3),直接拖到工具栏作为一个按钮即可。 4.当然你还可以为这个按钮添加快捷键。跟通常的添加快捷键操作一样。 5.至于VS2008 menu->tools->external tools 里添加我们的程序。 6.用起来很不错,推荐这一种方法 点评: 1.以上3种方法,第一种是执行效果是最快的。因为不需要启动程序。 2.后两种都要启动一个程序,所以速度欠佳,但仍在接受范围内。 3.第三种是最好的。因为它就像操作一个工具栏上的按钮,很方便。 希望对你有用!阿弥陀佛! ****************************************************************************/ #include <windows.h> #include <tchar.h> #include <string> using namespace std; //兼容ANSI和UNICODE #ifdef _UNICODE #define __string wstring #else #define __string string #endif /**************************************************************************** 设置剪贴板文本 ****************************************************************************/ static bool SetClipBoardText(const TCHAR* text,HWND hWnd=NULL) { //打开剪贴板 if ( !::OpenClipboard(hWnd) ) return false; //empties the clipboard and frees handles to data in the clipboard if ( !EmptyClipboard() ) { CloseClipboard(); return false; } //get text length int len=_tcslen(text); //After SetClipboardData is called, the system owns the object identified by the hMem parameter. //The application can read the data, but must not free the handle or leave it locked. If the //hMem parameter identifies a memory object, the object must have been allocated using the //GlobalAlloc function with the GMEM_MOVEABLE and GMEM_DDESHARE flags. HANDLE hClip=GlobalAlloc(GMEM_MOVEABLE|GMEM_DDESHARE,(len+1)*sizeof(TCHAR)); if (hClip==NULL) { CloseClipboard(); return false; } //locks a global memory object and returns a pointer to the first byte of the object's memory block TCHAR* pBuf=(TCHAR*)GlobalLock(hClip); if (pBuf==NULL) { GlobalFree(hClip); CloseClipboard(); return false; } memcpy(pBuf,text,len*sizeof(TCHAR)); pBuf[len]=NULL; GlobalUnlock(hClip); if (NULL==SetClipboardData(CF_TEXT,hClip)) { GlobalFree(hClip); CloseClipboard(); return false; } CloseClipboard(); return true; } /**************************************************************************** 获取剪贴板文本 ****************************************************************************/ static __string GetClipBoardText(HWND hWnd=NULL) { __string ClipBoardText; //判断剪贴板的数据格式是否可以处理。 if (!IsClipboardFormatAvailable(CF_TEXT)) return ClipBoardText; //打开剪贴板。 if (!::OpenClipboard(hWnd)) return ClipBoardText; //获取数据 HGLOBAL hMem = GetClipboardData(CF_TEXT); if (hMem != NULL) { //获取字符串。 LPTSTR lpStr = (LPTSTR)GlobalLock(hMem); if (lpStr != NULL) { ClipBoardText=lpStr; //释放锁内存 GlobalUnlock(hMem); } } //关闭剪贴板 CloseClipboard(); return ClipBoardText; } /**************************************************************************** 为文本添加或去除注释 ****************************************************************************/ bool CommentText() { //保存现在剪贴板的文本内容 string PreText=GetClipBoardText(NULL); //调用Ctrl+c 复制当前选择的文本到剪贴板 keybd_event(VK_CONTROL,0,0,0); keybd_event('C',0,0,0); keybd_event('C',0,KEYEVENTF_KEYUP,0); keybd_event(VK_CONTROL,0,KEYEVENTF_KEYUP,0); //延时 Sleep(100); //获取剪贴板文本 string text=GetClipBoardText(); if (text.size()==0) return false; //如果没有注释,则添加注释 if (-1==text.find(_T("/*"))) { //开头添加/* if (text.at(0)=='/r'|| -1==text.find(_T("/r/n")) ) //字符串开头已经有换行符或者整个字符串没有换行 text.insert(0,"/*"); else text.insert(0,"/*/r/n"); //末尾添加*/ if (-1==text.find(_T("/r/n")) ) //整个字符串没有换行 text.insert(text.size(),"*/"); else if (text.at(text.size()-1)!='/n') //字符串最后没有换行符 text.insert(text.size(),"/r/n*//r/n"); else //字符串最后有换行符 text.insert(text.size(),"*//r/n"); } //去掉注释 else { //替换掉 "/*" 和 "*/" string::size_type FindPos; FindPos=0; while(string::npos!=(FindPos=text.find("/*",FindPos))) text.erase(FindPos,2); FindPos=0; while(string::npos!=(FindPos=text.find("*/",FindPos))) text.erase(FindPos,2); //如果开头有换行符/r/n,则去掉 if (text.at(0)=='/r' && text.at(1)=='/n' ) text.erase(0,2); //如果末尾有换行符/r/n,则去掉 if (text.at(text.size()-1)=='/n') text.resize(text.size()-2); } //修改后的文本放到剪贴板 if (!SetClipBoardText(text.c_str())) return false; //延时 // Sleep(50); //粘贴 keybd_event(VK_CONTROL,0,0,0); keybd_event('V',0,0,0); keybd_event('V',0,KEYEVENTF_KEYUP,0); keybd_event(VK_CONTROL,0,KEYEVENTF_KEYUP,0); Sleep(100); //还原先前的文本到剪贴板 SetClipBoardText(PreText.c_str()); return true; } WNDPROC OldWndProc; bool CreateWnd(); int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) { //create window if ( !CreateWnd() ) return false; MSG msg; while(GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam ; } LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam) { switch(message) { case WM_LBUTTONDOWN: CommentText() ; break; case WM_CLOSE: PostQuitMessage(0); } return ::CallWindowProc(OldWndProc, hWnd, message, wParam, lParam); } bool CreateWnd() { #define WS_EX_NOACTIVATE 0x08000000L //无焦点 HWND hWnd = CreateWindowEx(WS_EX_TOPMOST|WS_EX_NOACTIVATE|WS_EX_TOOLWINDOW, _T("BUTTON"), _T("Comment Text"), WS_OVERLAPPEDWINDOW|WS_VISIBLE, 200,200,100,50,NULL,NULL,NULL,NULL) ; if (!hWnd) return FALSE; //把hWnd的默认窗口过程替换为WindowProc,返回默认函数过程的函数指针 OldWndProc=(WNDPROC)SetWindowLong(hWnd,GWL_WNDPROC, (LONG) (WndProc)); return true; } |