0

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

好吧,我得到了“播放”按钮的坐标(它是 (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没有影响。

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

ps 将鼠标移到winamp播放按钮,而不是单击,而不是向后移动,这不适用于我。
对于 winamp 来说,也无法获得按钮的句柄。使用按钮句柄 SendMessage() 可以很好地工作,但使用坐标则根本不行。

补充 #1

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

补充 #2

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

spy++ 中的消息

4

3 回答 3

2

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

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

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

更多信息在这里这里这里

于 2012-07-25T14:10:49.170 回答
1

好吧,要在 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
    - 第三个参数 -0或者IntPtr.Zero
    - 第四个参数 - 要释放鼠标按钮的点的坐标(如果要使单击生效,则需要与第一个 PostMessage() 相同;该参数可以计算如下 - ((Y << 16) | X)

感谢大家的意见!

于 2012-07-26T15:52:32.550 回答
0

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

于 2012-07-25T14:10:33.833 回答