请问如何全局得到选择好(可以被copy, cut)的文本内容。比如在一些编辑器,浏览器中选定的文本内容。用什么方法能做到?是否可以用api hook。如果可用,那么hook那个api函数呢?

解决方案 »

  1.   

    告诉你一个好办法,我刚刚做过。用IDataObject接口。
      

  2.   

    你要具体查IDataObject的用法。下面是个获得文本的例子:(我刚刚调试成功了)
    IDataObject *lpd;
    HRESULT hr;
    hr=OleGetClipboard(&lpd);
    FORMATETC fe;
    fe.cfFormat=CF_TEXT;
    fe.ptd=NULL;
    fe.tymed=TYMED_HGLOBAL;
    fe.dwAspect=DVASPECT_CONTENT;
    fe.lindex=-1;
    if(lpd->QueryGetData(&fe)==S_OK)
    {
        TRACE("OK!\n");
    }
    STGMEDIUM stg;
    lpd->GetData(&fe,&stg);
    LPSTR cp=(LPSTR)GlobalLock(stg.hGlobal);
    TCHAR szDisplayText[128];
    lstrcpyn(szDisplayText,cp,127);
    GlobalUnlock(stg.hGlobal);
    ReleaseStgMedium(&stg);
    lpd->Release();
    //CString str="";
    //str.Format("%s",szDisplayText);
    //MessageBox(str);
      

  3.   

    作一个简单的dialog程序,在按钮响应事件中加入这些代码。
    任意在浏览器中拷贝一些文本,再按那个按钮试试看,是不是看到MessageBox中的文本了?
      

  4.   

    感谢sjsj的帮助,但是我不能用.net框架,只能用mfc等传统的方法,就是说用vc6.0。
    我想先保留这个贴子,我另外给个贴子“sjsj进来领分”你一进来,我就给100分。
    我把需求再说清楚一点,可以用clipboard机制,最好不用,就是随时将用户选中的文本导到我的程序(可以是一个对话框)中。当用户在任意程序中选中文本时,按一下鼠标右健或给个快捷键就可以将文本导到我的程序中了。
      

  5.   

    if (!IsClipboardFormatAvailable(CF_TEXT)) 
    return 0; 
    if (!OpenClipboard()) 
    return 0;
    hglb = GetClipboardData(CF_TEXT); 
    if (hglb != NULL) 

    lptstr = (char*)GlobalLock(hglb);
    if (lptstr != NULL) 
    {
                        ...
    GlobalUnlock(hglb); 
    }

    CloseClipboard(); 
      

  6.   

    如果你要随时监测剪贴板内容的改变,用: SetClipboardViewer()