字符串添加_T()宏小工具

字符串添加_T()宏小工具

更新日期:2011-1-23

━━━━━━━━━━━━━━━━━━━━━━━━
 

/****************************************************************************
函数AddTextMacro() 可以为字符串添加_T()宏。

原理:
    很简单。
    1.模拟按键Ctrl+C 把选定文本放到剪贴板,
    2.在程序里取出文本添加_T()。
    3.再把文本放入剪贴板。
    4.模拟按键Ctrl+V 粘贴文件。

方法一:
    1.把以下代码粘贴到一个Win32工程里,编译链接生成一个exe程序。
    2.运行程序会出项一个无焦点的按钮窗口(就像是浮动工具条)
    3.选择要添加_T()宏的字符串,单击按钮即可为字符串添加_T()宏

方法二:由于多了一个窗口,很不方便,你也可以把创建按钮窗口的代码去掉,直接在WinMain函数里添加AddTextMacro()
    如下:
    int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
    {
        AddTextMacro()
        return false ;
    }

    2.然后生成一个没有窗口的小程序.程序一运行就调用AddTextMacro() 函数为选择的文本添加_T()
    3.在桌面为exe创建快捷方式,并右键-》属性-》添加快捷键。
    4.操作时在IDE中选择文本,按快捷键就会调用exe,并对选择的文本进行_T()。

方法三:我想是最好的方案了。
    1.右键VC6工具栏-》自定义-》属性页选择“工具”-》新建一项工具,添加方法二生成的AddTextMacroBtn.exe程序。确定退出。
    2.之后你可以在主菜单的工具里看到你添加的工具。
    3.再右键VC6工具栏-》自定义-》属性页选择“命令”-》类别选择“工具”-》在右边按钮中会列
      出所有工具。找到我们添加的那一项工具的按钮(按钮下标是1.2.3),直接拖到工具栏作为一个按钮即可。
    4.当然你还可以为这个按钮添加快捷键。跟通常的添加快捷键操作一样。
    5.至于VS2008 menu->tools->external tools 里添加我们的程序。
    6.用起来很不错,推荐这一种方法

点评:
1.以上3种方法,第一种是执行效果是最快的。因为不需要启动程序。
2.后两种都要启动一个程序,所以速度欠佳,但仍在接受范围内。
3.第三种是最好的。因为它就像操作一个工具栏上的按钮,很方便。

推荐:
请看另外一篇文章,为文件中的所有字符串添加_T()宏。
http://hi.baidu.com/qiujiejia/blog/item/46057f2bacf7abeae7cd407b.html

希望对你有用!阿弥陀佛!
****************************************************************************/


#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(200);

    //获取剪贴板文本
    string text=GetClipBoardText();

    if (text.size()==0)
        return false;

    //添加_T() 宏
    text.insert(0,_T("_T("));
    text+=_T(")");
   
    //修改后的文本放到剪贴板
    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("Add _T()"),
        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;
}

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值