1。用向导新建了一个简单的对话框。 
2。加入一个button1,两个Eedit,响应代码如下:
void CShelltrayDlg::OnButton1() 
{
   CPoint pt;
   HWND   h;
   char   str[]="hello!!!";        SetDlgItemText(IDC_EDIT2,"start...");
        ::Sleep(1000);
        ::GetCursorPos(&pt);
        h=::WindowFromPoint(pt);
        if (h==0) exit;
        else 
         ::GetWindowText(h,str,255); 
        if (str[0]==NULL) ::SendMessage(h,WM_GETTEXT,255,(long)str);
        if (str[0]!=NULL)
         SetDlgItemText(IDC_EDIT1,str);
        else 
         SetDlgItemText(IDC_EDIT1,"失败了");
        SetDlgItemText(IDC_EDIT2,"Over!");
}//////////得到WindowText的代码/////////////编译,连接都没问题。执行时用鼠标指向一些窗口没问题,可指向某些窗口(如任务栏)时就会“执行了非法操作”!!!这是怎么回事啊??真的很搞不懂啦望指点一二

解决方案 »

  1.   

    ::GetWindowText(h,str,255); // wrong
    strlen( str ) 大概 strlen( "hello!!!" )解决方法
    char str[ 300 ] = "hello!!!";
      

  2.   

    Explorer 出错,重新启动一次再试
    估计是这个问题,有时编译后会出现这样的问题
      

  3.   

    把char str[]="hello!!!"
    换成CString类型的
      

  4.   

    strlen( str ) 应该是不行的,因为调用::GetWindowText(h,str,255); 的时候不知道str究竟有多大的长度!
    但为什么对任务栏也不行呢? 在delphi里是很容易得到任务栏的windowtext的啊!!??
      

  5.   

    把char str[]="hello!!!"
    换成CString类型的
    ///////////////////
    这样我试过,或许太弱智,总是说类型不对头!
      

  6.   

    可指向某些窗口(如任务栏)时就会“执行了非法操作”!!!
    我还是认为是缓冲区太小的原因
    char   str[]="hello!!!";
    str[0]-str[8]
    一共9个字节,而下面::GetWindowText(h,str,255); 指定长度255别的不说,这里首先就是个bug.
      

  7.   

    可如果用:
    ::GetWindowText(h,str,strlen(str)); 对于比较长的字符串,又怎么处理呢?
      

  8.   

    我试了一下,用::GetWindowText(h,str,strlen(str)); 确实不会出现非法操作的情况. 但我想问一下,怎样得到任务栏的句柄呢?不用鼠标指向的方法!怎么写???