大家好,最近遇到个问题,不知道大虾们遇到过没有?帮忙啊!~问题:我想得到或设定其他窗口的滚动条信息?比如:滚动条的位置,滚动条的范围等等!我的做法:先得到目标窗口的句柄(这个我是用Spy++得到的),比如为:mhWnd, 完了向 mhWnd 发消息:SCROLLINFO si;
ZeroMemory(&si, sizeof(si));
si.cbSize = sizeof(si);
si.fMask = SIF_RANGE;::SendMessage(mhWnd, WM_VSCROLL, SB_LINEDOWN, 0);        成功!
::SendMessage(mhWnd, WM_VSCROLL, SB_PAGEDOWN, 0);        成功!
::SendMessage(mhWnd, SBM_GETCROLLINFO, 0, &si);          失败!???为什么会失败呢,同时,我用::GetScrollPos(mhWnd, SB_VERT);也失败,用GetLastError()返回错误码为1447,“无法处理非多重文档界面   (MDI)   窗口中的消息”,我该怎么办呢?用什么方法能正确的得到信息呢?请各位多多指教啊!

解决方案 »

  1.   

    SendMessage中使用的指针必须是窗口所属进程中的地址。如果要给非本进程的窗口发消息,需要用OpenProcess打开目标进程,用VirtualAllocEx在目标进程中分配内存,用ReadProcessMemory/WriteProcessMemory在本进程和目标进程间复制内存数据。
      

  2.   

    各位大虾,我并不知道目标窗口的滚动条类型啊,我是指任意一个Window到窗口,比如IE7.0的窗口,word文档的窗口等等,我该怎么样得到目标窗口的滚动条信息呢?如果 “SendMessage中使用的指针必须是窗口所属进程中的地址”那我发送
    ::SendMessage(mhWnd, WM_VSCROLL, SB_LINEDOWN, 0);为什么就成功,而::SendMessage(mhWnd, SBM_GETCROLLINFO, 0, &si);或::GetScrollPos(mhWnd, SB_VERT);就不成功呢?请各位再深入指点下,谢谢!
      

  3.   

    因为WM_VSCROLL消息不需要传递内存指针,该消息的两个参数SB_LINEDOWN和0都是常数;而SBM_GETSCROLLINFO的lParam参数要给一个SCROLLINFO结构的地址,这个地址必须是目标进程中的地址才可以。
      

  4.   

    多谢 cnzdgs ,多谢大家,我回去实践下!