我想用SendMessage发送鼠标点击但它不能正常工作,我的代码有什么问题?
Int窗口不为0,但仍无法正常工作。
[DllImport("user32.dll")]
public static extern int SendMessage(int hWnd, uint Msg, int wParam, int lParam);
[DllImport("user32.dll")]
public static extern int FindWindow(string lpClassName, string lpWindowName);
private const uint WM_RBUTTONDOWN = 0x0204;
private const uint WM_RBUTTONUP = 0x0205;
private int MAKELPARAM(int p, int p_2)
{
return ((p_2 << 16) | (p & 0xFFFF));
}
public void ClickOnPoint(System.Drawing.Point p)
{
int window = FindWindow(null, "Untitled - Notepad");
//System.Windows.Forms.MessageBox.Show(window + "\n" );
SendMessage(window, WM_RBUTTONDOWN, 0, MAKELPARAM(500,500));
SendMessage(window, WM_RBUTTONUP, 0, MAKELPARAM(500, 500));
}
答案 0 :(得分:1)
我尝试这样做。
答案 1 :(得分:0)
“textarea”是记事本应用程序主窗口的子窗口。
(使用Spy ++在Windows 10上截图)
我们需要该子窗口的窗口句柄,它没有标题和“EDIT”类,并将鼠标单击消息发送到该子窗口以显示其上下文菜单。
使用this answer从您已经获得的子窗口句柄中获取子窗口句柄。
请务必仅使用有效句柄调用API函数:
if(IsWindow(hWndChild))
{
SendMessage(hWndChild, WM_RBUTTONDOWN, MK_RBUTTON, MAKELPARAM(p.X, p.Y));
SendMessage(hWndChild, WM_RBUTTONUP, MK_RBUTTON, MAKELPARAM(p.X, p.Y));
}
警告:这是特定于实现的。您永远不会知道在未来的版本中是否会继续像这样构建记事本。虽然,IMO,在所有Windows应用程序中,它可能最有可能保持不变。