C# 将鼠标单击发送到winamp

C# 将鼠标单击发送到winamp,c#,winapi,winamp,C#,Winapi,Winamp,我正在尝试使用win api学习鼠标/键盘模拟。 我发现可以使用sendmessage()函数模拟按钮单击 我得到了“播放”按钮的坐标(它是(60;100))并尝试使用以下代码按下此按钮: int x = 60; int y = 100; int lParam = ((x << 16) | (y & 0xffff)); int parentWindow = FindWindow(

我正在尝试使用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
intx=60;
int y=100;

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

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

要让Winamp播放/暂停当前歌曲,只需向其发送一条播放/暂停消息,该消息长40046,如
Winamp.h
中所定义。您必须发送它在
WM_WA_IPC
消息(即用户消息,也称为
WM_user
)中,而不是
WM_LBUTTONDOWN

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

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

更多信息和。

要让Winamp播放/暂停当前歌曲,只需向其发送一条播放/暂停消息,其长度为40046,如
Winamp.h
中所定义。您必须以
WM_WA_IPC
消息(这是一条用户消息,也称为
WM_user
)而不是
WM_LBUTTONDOWN
发送

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

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

更多信息,以及。

好吧,要在winamp窗口中模拟鼠标单击,您需要准确地执行使用硬件鼠标单击时发生的操作。以下内容可从spy++中找到:

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

  • 调用两次
    PostMessage()
  • 对于第一个PostMessage(),参数应如下所示:
    -第一个参数-Winamp窗口句柄(在本例中为
    005E09FA

    -第二个参数-鼠标左键按下时事件的winapi代码(
    WM_LBUTTONDOWN=0x201

    -第三个参数-
    MK_LBUTTON=0x1
    (似乎有必要传递它。如果有人能解释原因,那就太好了)

    -第四个参数-要按下鼠标按钮的点的坐标(此参数可按以下方式计算-
    ((Y好的,要在winamp窗口中模拟鼠标单击,您需要准确地执行使用硬件鼠标单击时所发生的操作。以下内容可从spy++中找到:

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

  • 调用两次
    PostMessage()
  • 对于第一个PostMessage(),参数应如下所示:
    -第一个参数-Winamp窗口句柄(在本例中为
    005E09FA

    -第二个参数-鼠标左键按下时事件的winapi代码(
    WM_LBUTTONDOWN=0x201

    -第三个参数-
    MK_LBUTTON=0x1
    (似乎有必要传递它。如果有人能解释原因,那就太好了)


    -第四个参数-要按下鼠标按钮的点的坐标(此参数可按以下方式计算-
    ((请参阅:。鼠标输入与此上下文中的键盘输入相同。为什么不使用UIAutomation命名空间可能存在重复?这就是它的用途。@Deanna,我自己解决了它,只是忘了将其标记为答案,谢谢提醒。如果感兴趣,请参阅下面的答案。请参阅:。鼠标输入与此上下文中的键盘输入相同。possib为什么不使用UIAutomation命名空间?这就是它的用途。@Deanna,我自己解决了它,只是忘了将它标记为答案,谢谢你提醒我。如果感兴趣,请参阅下面的答案。我尝试过,因为我认为不移动鼠标光标不可能进行单击。我需要模拟鼠标单击而不移动鼠标光标。如果你只模拟鼠标输入行为的一部分,你就不是在真正模拟它。让鼠标在光标不在的地方点击是毫无意义的。@tenfour,如果我们说的是测试目的,那么在光标不在的地方点击是有意义的,因为它允许你做任何其他事情,当y我们的测试正在进行。不,那不是一个完整的模拟。你不能既吃蛋糕又吃蛋糕。也许你应该把它放在虚拟机里?@tenfour,好吧,也许有一些我不知道的隐藏陷阱,但它似乎对我有效。请看我的答案。好吧,我试过了,因为我认为没有它是不可能点击的移动鼠标光标。我需要在不移动鼠标的情况下模拟鼠标点击。如果你只模拟鼠标输入行为的一部分,你就不是在真正模拟它。让鼠标点击在光标不在的地方是毫无意义的。@tenfour,如果我们说的是测试目的,那么在光标不是,因为它允许你在执行测试时做任何其他事情。不,它不是一个完整的模拟。你不能既吃蛋糕又吃蛋糕。也许你应该把它放在虚拟机中?@tenfour,也许有一些我不知道的隐藏陷阱,但它似乎对我有效。请看我的答案。它是很好,但我最初的目的是了解如何模拟鼠标/键盘。不过,谢谢。@mr。如果是为了学习,那就什么都不做了,为什么你不编写自己的测试程序来发送它接收到的所有Windows消息呢?你也可以使用
    Spy++
    来实现这一点。嗯,我已经在使用Spy++了,当我执行代码pr时上面的ovided spy++检测到一些奇怪的消息,但它们不是WM_LBUTTONDOWN或WM_LBUTTONUP或类似的东西。请参阅更新的主题(屏幕截图)。很好,bu