已经打开了一个记事本文件,我如何获取它的路径?通过findwindow我得到了它的窗口句柄,然后就不知道用哪个获得它的路径了。-_-!!
谢谢各位帮忙了!!

解决方案 »

  1.   

    已知文件名取文件所在目录?最简单的办法是从后向前查找"\\".但有时,文件名中没有"\\",这时就要先对文件名进行转换.具体代码如下:
    CString GetPathName(const CString strPathFileName)
    {
    //取得经过处理后的文件名长度
    int nLength = GetFullPathName(strPathFileName,0,NULL,NULL);
    if( 0 == nLength )
    return "" ;//取得新文件名
    CString strPathName ;
    char * pszPathName = strPathName.GetBufferSetLength(nLength);
    nLength = GetFullPathName(strPathFileName,nLength,pszPathName,NULL);
    strPathName.ReleaseBuffer();
    if( 0 == nLength )
    return "" ;//取得路径
    int nPos = strPathName.ReverseFind('\\');
    if(-1 == nPos )
    return "";
    strPathName = strPathName.Left(nPos);
    return strPathName ;
    }测试代码如下:
    void CMy2View::OnDraw(CDC* pDC)
    {
    CMy2Doc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);CString strMess ;
    CString strInput[] = {"1.txt","c:\\2.txt","d:3.txt","e:\\2/4.txt"};int iCount = sizeof(strInput)/sizeof(strInput[0]) ;
    for(int i = 0 ; i < iCount ; i++ )
    {
    CString strLine ;
    CString strOutput = GetPathName(strInput[i]) ;
    strLine.Format("文件名: %s\r\n对应文件夹 %s\r\n\r\n",strInput[i],strOutput);
    strMess += strLine ;
    }CRect r ;
    GetClientRect(r);
    pDC->DrawText(strMess,&r,0);
    }结果如下:
    文件名: 1.txt 
    对应文件夹 G:\TEST\2 文件名: c:\2.txt 
    对应文件夹 c: 文件名: d:3.txt 
    对应文件夹 D: 文件名: e:\2/4.txt 
    对应文件夹 e:\2
      

  2.   

    谢谢这位朋友,我现在在单位还不能测试你的这短代码,不知道你的做法是不是能够达到我的要求。我做的这个东西是这样的:
    条件:已经打开一个txt文件,比如:检查结果.txt,这个名字是固定的。
    效果:我打开我制作的程序,点击一个按钮,他会自动的找到<检查结果.txt>的路径,然后根据这个路径读取它里面的内容。
      

  3.   

    。。本人失败.
    假设你是想知道文本程序所打开的文件的绝对路径名.从外界.
    首先说正规的思路:
    1.获得这个程序窗口->2获得进程->3获得进程内部文件句柄->4获得该文件的全名.
    3->4的过程网上已经有代码了, 
    (这个代码还不能获得新建的长度为0的文件名) 
    2->3这个过程我上网搜索了很多(重复更换关键字),提的人很少(全是csdn上提的),
    而且都只有人up没有人解决.
    另外notepad程序 打开文件后就close了文件句柄,直到保存的时候才再次打开.无法跟踪它.倒是有个老外的代码能做到 "给我个文件,我能罗列哪些进程使用了它."
    此路代价较大,待高手出现吧.二. 首先可以获得这个文本文件的文件名 从notepad的标题,但是这并没什么用.因为磁盘叫这样名字的文件太多了..三.发现LZ仿佛是想调用程序读取文本内容,那有的一个办法是使用找窗口句柄的办法,但是只能notepad里的文本内容,很可能被更改过了.
    我的代码:
        char   szText[256];  
        WPARAM   m_wParam   =   sizeof(szText);   
        LPARAM   m_lParam   =   (LPARAM)szText;
       HWND m_hWnd=FindWindow(("Notepad"),NULL);   
       HWND m_hWnd1=FindWindowEx(m_hWnd,NULL,"Edit",NULL);
       //::GetWindowText(m_hWnd1,a,sizeof(a));
       ::SendMessage(m_hWnd1,WM_GETTEXT ,m_wParam,m_lParam);
       MessageBox(0,szText,"",0);
      就能显示当前记事本里的内容.
     另外gettext消息并不是 谁都会理睬你的.记事本是好心理睬了你而已.四.考虑使用HOOK,但是要比记事本 先运行.HOOK createfile()这个api函数.获得notepad.exe调用createfile()时候用的函数参数就是文件的路径了. 本人不了解HOOK,不多说.
    这条路可行。
      

  4.   

    太感谢emptyness(问题事小,结帐事大~) ,你的方法三就可以满足我的要求了。自身不是学编程方面的,思路就狭窄了很多。再次感谢了!!
    感觉所有这楼里所有的朋友!