我正在尝试使用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
以下是我执行上述代码后收到的消息。
答案 0 :(得分:2)
要让Winamp播放/暂停当前歌曲,只需向其发送播放/暂停消息,该消息长度为winamp.h
中定义的40046。您必须使用WM_WA_IPC
消息(用户消息,也称为WM_USER
)而不是WM_LBUTTONDOWN
发送消息。
所以,这样的事情应该做:
SendMessage(parentWindow, WM_USER, IntPtr.Zero, new IntPtr(40046));
答案 1 :(得分:1)
好吧,要在winamp窗口中模拟鼠标点击,您只需要用硬件鼠标点击它就可以完成正在发生的事情。以下是从间谍++中发现的:
因此,要模拟鼠标点击,我们需要:
PostMessage()
代替SendMessage()
,因为上面屏幕截图中的“P”告诉我们该消息来自PostMessage()(根据{{3 }})005E09FA
)WM_LBUTTONDOWN = 0x201
)时事件的winapi代码
- 第三个参数 - MK_LBUTTON = 0x1
(看来,有必要通过它。如果有人可以解释原因,那将会很棒)((Y << 16) | X)
)005E09FA
)WM_LBUTTONUP = 0x202
)0
或IntPtr.Zero
((Y << 16) | X)
)< / LI>
醇>
感谢大家的投入!
答案 2 :(得分:0)
您应该使用SendInput()
将输入发送到其他应用程序,而不是伪造窗口消息。