我正在尝试使用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没有影响。
有人能告诉我我犯的错误吗?任何帮助都是非常感谢的!
附注:它不适用于我移动鼠标到winamp播放按钮,比做一个点击,而不是移动它回来。
对于winamp来说,不可能得到按钮的手柄。有了按钮句柄,SendMessage()运行得相当好,但在坐标下却完全不起作用。
加法#1
好的,上面的代码激活winamp窗口并显示它,如果它被最小化的话。但按一下按钮还是不想被按的;
加法#2
以下是执行上述代码后收到的消息。

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

因此,要模仿鼠标单击,我们需要:
PostMessage()而不是SendMessage(),因为上面屏幕截图中的"P"告诉我们消息是从PostMessage()获得的(根据msdn)005E09FA)WM_LBUTTONDOWN = 0x201)MK_LBUTTON = 0x1 (似乎有必要传递它。如果有人能解释原因,那就太好了。((Y << 16) | X))005E09FA)WM_LBUTTONUP = 0x202)0或IntPtr.Zero((Y << 16) | X))谢谢大家的意见!
发布于 2012-07-25 14:10:49
要让Winamp播放/暂停当前歌曲,只需发送一条播放/暂停消息,它是winamp.h中定义的长40046。您必须用WM_WA_IPC消息(这是一条用户消息,也称为WM_USER)而不是WM_LBUTTONDOWN来发送它。
所以,像这样的事情应该可以做到:
SendMessage(parentWindow, WM_USER, IntPtr.Zero, new IntPtr(40046));更多信息这里,这里和这里。
发布于 2012-07-25 14:10:33
您应该使用SendInput()向其他应用程序发送输入,而不是伪造窗口消息。
https://stackoverflow.com/questions/11651051
复制相似问题