本帖最后由 jinder 于 2009-07-06 21:06:49 编辑

解决方案 »

  1.   

    这要分情况而定,如果程序使用的是自定义的滚动条控件(如VB的滚动条),那就比较难办了,还需要使用远程线程HOOK该控件,并分析后获得位置;如果是标准的Windows滚动条控件,则可以使用Public Declare Function GetScrollPos Lib "user32" Alias "GetScrollPos" (ByVal hwnd As Long, ByVal nBar As Long) As Long函数获得位置,hwnd为滚动条所在窗口的句柄,nBar指定需要获得位置的滚动条。
      

  2.   

    滚动条这种东西通常有3种
    1、Windows的滚动条
    2、控件形滚动条,如VB自代的内部控件里的滚动条或像 Microsoft Windows Common Controls-2.6
       中的 FlatScrollBar 这种外部控件的滚动条
    3、自己创建的 ActiveX 滚动条,通常这种完全是为了界面美观或特殊的界面需求而开发。比如模仿 
       Linux 里的滚动条样式等。第一种滚动条最容易控制,如楼上所言,有专门的 API 接口可用。
    第二种我没有测试过,但相信 Microsoft 开发的时候应该做了 Windows 消息支持,可能可以通过消息
    来控制。如果是公用的外部控件,还可以找出类地址,然后将类地址复制到你定义的类变量中,然后直接
    用类的方式来控制。
    对于第三种,也是最难的一种,因为开发这种东西的人并不一定做得支持外部消息设置,也没有公共的类
    接口出来,即使你找到了类地址也不知道怎么用。除非他提供接口给你。就比如我做的一个内部的滚动条
    控件,没有外部消息接口,只接收鼠标的控制,属性和方法都是自己定义的,还和VB用的那些名称不同,
    如果说让我从外部去控制他,还真是个麻烦事。所以说你要搞清楚你要控制的到底是什么类型的滚动条,然后才去像如何控制那个东西。
      

  3.   

    估计那就像个鼠标滚轮,不是什么控制滚动条,是只有支持鼠标滚轮的程序才有用的。就比如我做个滚动条,但不支持鼠标滚轮消息的处理,相信他没法让我的滚动条动起来。
    对于其他程序相信也是一样的,要看对方是否作了类似的处理。而要模拟鼠标滚轮操作,可以通过Windows消息进行模拟
    WM_MOUSEWHEEL
    -7864320   '向下滚动
    7864320    '向上滚动
    如:
    SendMessage 目标窗口句柄, WM_MOUSEWHEEL, 7864320, 0
    SendMessage 目标窗口句柄, WM_MOUSEWHEEL, -7864320, 0注意:通常这个“目标窗口句柄”是指拥有滚动条窗口的句柄,如果是个编辑框上的滚动条,则向编辑框句柄发送滚动消息,这种方法我在记事本上测试过,只要指定的句柄是记事本的Edit句柄,是可行的。
      

  4.   


    这些我有试过,垂直的只是滚轮事件而已,先不讨论,单说水平滚动条吧.
    我试过下边的方法:
     1、mouse_event(MOUSEEVENTF_HWHEEL, 0, 0, 120, 0)  水平向右滚动
        此方法对记事本有效,对vs2008代码编辑框无效,对WPF窗口里的滚动条无效
       (这个方法视乎只针对二楼说得Windows的滚动条) 2、SendMessage / PostMessage(目标窗口句柄, WM_HSCROLL,SB_LINERIGHT, 0)  水平向右滚动
        此方法对记事本有效,对VS2008代码编辑框有效,对WPF窗口里的滚动条无效(WPF窗口里所有控件包括窗口都仅有一个句柄,故无法针对滚动条拥有者发送滚动消息)
       (这个方法还行,似乎只要找到了滚动条拥有者句柄就OK了,可惜不是所有窗口都能找出这个句柄,例如WPF)而我很神奇地发现,即使是WPF窗口,笔记本触摸板安装的那个驱动程序居然可以正常水平滚动(不管是XP还是VISTA)
    触摸板本来是没这个滚动功能的,需安装一个好像是驱动程序的软件后才有.
    就是想知道究竟这个程式是什么原理,它发出的那个通用的滚动消息是什么呢.
    如三楼所述,我也觉得必须先是滚动条本身支持才行,那就不应该把触摸板的那个软件理解成是硬件问题了,它应该也只是发送出了个滚动条看得懂的消息过去而已,很显然它用的不是我上边提到的那两种方法.
      

  5.   


    这个倒可以试试,不过对于WPF窗口,即使得到这个消息该发生给谁去接收呢....自己都有点矛盾了.还望高手帮我理清理清头绪.


    别激动,不好意思,是我说漏了一点,WPF窗口的滚动条所在控件句柄无法得知,只能获得其主窗口句柄.
      

  6.   


    觉得我应该去换个题目了,改成是:如何控制WPF窗口里的滚动条
      

  7.   

    SPY++看看消息先.....................然后模拟..............另外...........你是不是尝试发个PageUp/PageDown看看......??