SendMessage右键单击窗口

问题描述 投票:0回答:1

我正在尝试将鼠标右键发送到指定坐标的窗口。

我已经用2个代码测试过

代码1:

[DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
[DllImport("user32.dll")]        
static extern bool ScreenToClient(IntPtr hWnd, ref POINT lpPoint);

public struct POINT
{
    public int x;
    public int y;
}

var client = Process.GetProcessesByName("client_dx");
var whandle = client.MainWindowHandle;

POINT point = new POINT();
point.x = 1836;
point.y = 325;
ScreenToClient(whandle, ref point);
int lparm = (point.x << 16) + point.y;    
int lngResult = SendMessage(whandle, 0x0204, 0, lparm);
int lngResult2 = SendMessage(whandle, 0x0205, 0, lparm);

代码2:

[DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
[DllImport("user32.dll")]        
static extern bool ScreenToClient(IntPtr hWnd, ref POINT lpPoint);

public struct POINT
{
    public int x;
    public int y;
}

public int MakeLParam(int LoWord, int HiWord)
{
    return (int)((HiWord << 16) | (LoWord & 0xFFFF));
}

var client = Process.GetProcessesByName("client_dx");
var whandle = client.MainWindowHandle;

POINT point = new POINT();
point.x = 1836;
point.y = 325;

ScreenToClient(whandle, ref point);

int lparm = MakeLParam(point.x, point.y);
int lngResult = SendMessage(whandle, 0x0204, 0, lparm);
int lngResult2 = SendMessage(whandle, 0x0205, 0, lparm);

它发送的是右键单击,但未发送到正确的坐标,似乎忽略了我在LPARAM中指定的坐标,因为如果将鼠标移到窗口周围,则会单击鼠标的任何地方都将鼠标指针放到我没有放置的坐标中指定。

我已经测试过在代码2中更改此行:

int lparm = MakeLParam(point.x, point.y);

至此:

int lparm = (point.x << 16) + point.y;

但是不起作用,我得到了相同的结果...

c# sendmessage
1个回答
0
投票

您可以找到窗口,然后获取窗口矩形,然后将鼠标移至窗口矩形内的某个位置,然后发送右键单击事件。

示例

以下示例在打开的记事本实例的文本区域上单击鼠标右键:

//using System.Diagnostics;
//using System.Runtime.InteropServices;
const int MOUSEEVENTF_RIGHTDOWN = 0x0008;
const int MOUSEEVENTF_RIGHTUP = 0x0010;
[DllImport("user32.dll")]
static extern void mouse_event(uint dwFlags, uint dx, uint dy,
    uint cButtons, uint dwExtraInfo);

[DllImport("user32.dll")]
static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, 
    string lpszClass, string lpszWindow);

[DllImport("user32.dll")]
static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);
[StructLayout(LayoutKind.Sequential)]
struct RECT
{
    public int Left; public int Top;
    public int Right; public int Bottom;
}
public void PerformRightClick()
{
    uint X = (uint)Cursor.Position.X;
    uint Y = (uint)Cursor.Position.Y;
    mouse_event(MOUSEEVENTF_RIGHTDOWN | MOUSEEVENTF_RIGHTUP, X, Y, 0, 0);
}
private void button1_Click(object sender, EventArgs e)
{
    var notepad = Process.GetProcessesByName("notepad").FirstOrDefault();
    if (notepad != null)
    {
        var edit = FindWindowEx(notepad.MainWindowHandle, IntPtr.Zero, "Edit", null);
        GetWindowRect(edit, out RECT rect);
        Cursor.Position = new System.Drawing.Point(rect.Left + 2, rect.Top + 2);
        PerformRightClick();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.