发送鼠标点击winamp

时间:2012-07-25 13:38:46

标签: c# winapi winamp

我正在尝试使用win api学习鼠标/键盘模拟 我发现可以使用sendmessage()函数模拟按钮点击。

好吧,我得到了“play”按钮的坐标(它是(60; 100))并尝试使用以下代码按下此按钮:

            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没有影响。

有人能指出我犯的错误吗?任何帮助是极大的赞赏!

P.S。将鼠标移动到winamp播放按钮,而不是单击,而不是将其移回后,这对我来说不适用 另外对于winamp来说,按钮的手柄是不可能的。使用按钮手柄SendMessage()工作得相当好,但是坐标根本没有。

ADDITION#1

好吧,上面的代码会激活winamp窗口并显示它,如果它被最小化了。但是播放按钮stil不想被推动;(

ADDITION#2

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

Messages in spy++

3 个答案:

答案 0 :(得分:2)

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

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

SendMessage(parentWindow, WM_USER, IntPtr.Zero, new IntPtr(40046));

更多信息hereherehere

答案 1 :(得分:1)

好吧,要在winamp窗口中模拟鼠标点击,您只需要用硬件鼠标点击它就可以完成正在发生的事情。以下是从间谍++中发现的:
enter image description here

因此,要模拟鼠标点击,我们需要:

  1. 拨打两次PostMessage()代替SendMessage(),因为上面屏幕截图中的“P”告诉我们该消息来自PostMessage()(根据{{3 }})
  2. 第一个PostMessage()的参数应如下所示:
          - 第一个参数 - Winamp窗口句柄(在我们的例子中是005E09FA
          - 第二个参数 - 当鼠标左键按下(WM_LBUTTONDOWN = 0x201)时事件的winapi代码       - 第三个参数 - MK_LBUTTON = 0x1(看来,有必要通过它。如果有人可以解释原因,那将会很棒)
          - 第四个参数 - 要按下鼠标按钮的点的坐标(此参数可以按如下方式计算 - ((Y << 16) | X)
  3. 第二个PostMessage()的参数应如下:
          - 第一个参数 - Winamp窗口句柄(在我们的例子中是005E09FA
          - 第二个参数 - 当鼠标左键上升时事件的winapi代码(WM_LBUTTONUP = 0x202
          - 第三个参数 - 0IntPtr.Zero
          - 第四个参数 - 要释放鼠标按钮的点的坐标(如果希望点击产生效果,则需要与第一个PostMessage()一样;此参数可以按如下方式计算 - ((Y << 16) | X))< / LI>

    感谢大家的投入!

答案 2 :(得分:0)

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