1

我试图通过发送 WM_HSCROLL 来滚动其他程序(PowerPoint 2013),并且只有当我向 SendMessage 提供正确的 LPARAM(非 NULL)时它才会起作用。

LPARAM 的值是动态的,如果您关闭并打开一个新程序,它会发生变化。现在我只能通过挂钩 WM_HSCROLL 并手动单击滚动条来获得它的值。

// This is my code: 
LPARAM lParam = 0x0a616c38;  // Found by hooking WM_HSCROLL
SendMessage(hTarget, WM_HSCROLL, SB_LINERIGHT, lParam);

那么是否有可能以编程方式获得正确的 LPARAM?
非常感谢!

ps 滚动条不是 PowerPoint 2013 中的真实窗口。
ps 如果我使用 GetScrollInfo(hTarget, SB_CTL, &scrollinfo),它会返回 1,但 scrollinfo 中的所有值都为零。
ps Office Home and Student 2013 官方网站

4

2 回答 2

0

您是否尝试调用 GetLastError?

于 2013-02-05T09:02:28.917 回答
0

GetScrollInfo可能无法跨流程边界工作,所以我想说这就是为什么你没有得到有效值的原因。

对于标准窗口滚动条,消息的lParamWM_HSCROLL或者是 NULL,或者是滚动控件的句柄。每次运行程序时,滚动控件的句柄显然会发生变化,因此您需要自己找出这一点,然后才能可靠地模拟滚动输入。

为此,您可以使用该FindWindowEx函数在父窗口(在您的示例中为 hTarget)搜索“SCROLLBAR”类的子窗口。因为您可能会发现不止一个滚动条子窗口,您需要一些方法来区分它们——最有可能的是,通过窗口的 GWL_ID 值,因为这可能不会随着运行而改变。

于 2013-02-05T10:10:46.717 回答