首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将鼠标单击发送到winamp

将鼠标单击发送到winamp
EN

Stack Overflow用户
提问于 2012-07-25 13:38:46
回答 3查看 679关注 0票数 0

我正在尝试使用win api学习鼠标/键盘仿真。

我发现可以使用sendmessage()函数来模拟按钮单击。

我得到了"play“按钮的坐标(它是(60;100)),并试图使用以下代码按下这个按钮:

代码语言:javascript
复制
            int x = 60;
            int y = 100;
            int lParam = ((x << 16) | (y & 0xffff));

            int parentWindow = FindWindow("BaseWindow_RootWnd", "Main Window");//get main winamp window
            MessageBox.Show(parentWindow.ToString());//failed if 0

            SendMessage(parentWindow, WM_LBUTTONDOWN, IntPtr.Zero, new IntPtr(lParam));//send left mouse button down
            SendMessage(parentWindow, WM_LBUTTONUP, IntPtr.Zero, new IntPtr(lParam));//send left mouse button up

但是这个代码对winamp没有影响。

有人能告诉我我犯的错误吗?任何帮助都是非常感谢的!

附注:它不适用于我移动鼠标到winamp播放按钮,比做一个点击,而不是移动它回来。

对于winamp来说,不可能得到按钮的手柄。有了按钮句柄,SendMessage()运行得相当好,但在坐标下却完全不起作用。

加法#1

好的,上面的代码激活winamp窗口并显示它,如果它被最小化的话。但按一下按钮还是不想被按的;

加法#2

以下是执行上述代码后收到的消息。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-07-26 15:52:32

那么,要模拟鼠标点击winamp窗口,您需要做的正是正在发生的事情,当你只点击它的硬件鼠标。在spy++中发现了以下内容:

因此,要模仿鼠标单击,我们需要:

  1. 调用两次PostMessage()而不是SendMessage(),因为上面屏幕截图中的"P"告诉我们消息是从PostMessage()获得的(根据msdn)
  2. 第一个PostMessage()的参数应该如下:
    • 第一个参数- Winamp窗口句柄(在本例中是005E09FA)
    • 第二个参数-事件的winapi代码,当鼠标左键关闭时(WM_LBUTTONDOWN = 0x201)
    • 第三个参数- MK_LBUTTON = 0x1 (似乎有必要传递它。如果有人能解释原因,那就太好了。
    • 第四个参数-要按鼠标按钮的点的坐标(此参数可以计算如下- ((Y << 16) | X))

  3. 第二个PostMessage()的参数应该如下:
    • 第一个参数- Winamp窗口句柄(在本例中是005E09FA)
    • 第二个参数-当鼠标左键打开时,事件的winapi代码(WM_LBUTTONUP = 0x202)
    • 第三个参数- 0IntPtr.Zero
    • 第四个参数-要释放鼠标按钮的点的坐标(如果您希望单击具有效果,则需要与第一个PostMessage()一样;此参数可以计算为- ((Y << 16) | X))

谢谢大家的意见!

票数 1
EN

Stack Overflow用户

发布于 2012-07-25 14:10:49

要让Winamp播放/暂停当前歌曲,只需发送一条播放/暂停消息,它是winamp.h中定义的长40046。您必须用WM_WA_IPC消息(这是一条用户消息,也称为WM_USER)而不是WM_LBUTTONDOWN来发送它。

所以,像这样的事情应该可以做到:

代码语言:javascript
复制
SendMessage(parentWindow, WM_USER, IntPtr.Zero, new IntPtr(40046));

更多信息这里这里这里

票数 2
EN

Stack Overflow用户

发布于 2012-07-25 14:10:33

您应该使用SendInput()向其他应用程序发送输入,而不是伪造窗口消息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11651051

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档