Member 13615623 Ответов: 1

Отправка события мыши в неактивное окно


Здравствуйте, это Изабель Гарсия из Барселоны, и я нахожу некоторые проблемы с методом PostMessage для отправки события мыши в веб-браузер.

public void onClick2()
    {
        Process[] notepads = Process.GetProcessesByName("chrome");
        if (notepads.Length == 0) return;
        if (notepads[0] != null)
        {
            UnityEngine.Debug.Log("Encontrado");
            hWnd = FindWindowEx(notepads[0].MainWindowHandle, new IntPtr(0), "Edit", null);
         
            PostMessage(hWnd, MOUSEEVENTF_RIGHTDOWN, VK_RETURN, 0x001C0001);
            PostMessage(hWnd, MOUSEEVENTF_RIGHTDOWN, VK_DOWN, 0x00500001);

        }

    }


Кнопка, на которую я должен нажать, имеет уникальный идентификатор:
<a href="#" id="action-button" title="Share on WhatsApp" class="button button--simple button--primary">Send</a>

И я хотел бы получить доступ к этому удостоверению личности. Используя Spy++, я не могу получить доступ к этой кнопке.

Что я уже пробовал:

Я использовал SendKeys, но он работал с приложением Notepad.
Я использовал Spy++, но безуспешно с веб-страницей chrome.
Я перфом мыши, выполнив следующие действия:
private const uint MOUSEEVENTF_MOVE = 0x0001;
    private const uint MOUSEEVENTF_LEFTDOWN = 0x0002;
    private const uint MOUSEEVENTF_LEFTUP = 0x0004;
    private const uint MOUSEEVENTF_RIGHTDOWN = 0x0008;
    private const uint MOUSEEVENTF_RIGHTUP = 0x0010;
    private const uint MOUSEEVENTF_ABSOLUTE = 0x8000;
public void performClick(uint x, uint y)
    {
        //SetCursorPos(x, y);
        mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTDOWN, x, y, 0, UIntPtr.Zero);
        Thread.Sleep(200);
        mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTUP, x, y, 0, UIntPtr.Zero);
        UnityEngine.Debug.Log("performClick x: " + x  + "y: "+ y);
        //PostMessage(handle, MOUSEEVENTF_LEFTDOWN, 5, 5); https://stackoverflow.com/questions/409886/send-key-strokes-to-games-using-direct-input/50855426#50855426
    }

Gerry Schmitz

Вы используете "управление браузером"? Если нет, то почему? Если вы это сделаете, то сможете получить доступ к DOM.

Richard Deeming

Если вы пытаетесь автоматизировать веб-браузер, почему бы не использовать инструмент, специально созданный для этого?
Selenium - Автоматизация Веб-Браузера[^]

Шпион и PostMessage будут нацелены только те элементы управления, которые имеют свой собственный дескриптор окна. Браузеры не создают отдельный дескриптор окна для каждого элемента на странице. Если бы они это сделали, производительность и использование памяти были бы ужасающими.

1 Ответов

Рейтинг:
1

RickZeeland

Вероятно, вам нужно сначала сделать окно активным, см. статью здесь: Отправка нажатий клавиш в другое приложение на языке Си#[^]


Member 13615623

- Привет! Большое вам спасибо за быстрый ответ. Я попробовал следующее:
использование системы;
использование системы.Коллекции.Общий;
использование системы.ComponentModel;
использование System.Data;
использование системы.Рисование;
использование System.Text;
использование системы.Окна.Формы;
используя системы.Во время выполнения.InteropServices;

тест пространства имен
{
общественности частичного класс form1 : форма
{
открытый form1()
{
метод InitializeComponent();
}

const int WM_KEYDOWN = 0x100;
const int WM_KEYUP = 0x101;
const int WM_SYSKEYDOWN = 0x104;
const int VK_BACK = 0x08;
const int VK_F5 = 116; //Ox74

[DllImport("user32.dll")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

[DllImport("user32.dll", SetLastError = true)]
статический модификатор extern указателя IntPtr FindWindowEx(hwndParent указателя IntPtr, указателя IntPtr hwndChildAfter, lpszClass строку, строку lpszWindow);

[DllImport("user32.dll")]
статический внешний байт VkKeyScan(char ch);

[DllImport("User32.Dll", EntryPoint = "PostMessageA")]
статический модификатор extern bool и метод postMessage(hwnd элемента указателя IntPtr, типу uint MSG, которая инт параметр wparam, lparam должен инт);


частный недействительными методе form1_load(объект отправителя, EventArgs в электронной)
{

}

частная button1_Click_1 недействительным(объект отправителя, EventArgs в электронной)
{
строка msg = "123456";
IntPtr noteWnd = FindWindow("Блокнот", null);
если (!noteWnd.Равно(IntPtr.Zero))
{
EditWnd указателя IntPtr = FindWindowEx(noteWnd, указателя IntPtr.Ноль, "редактировать", нуль);
если (!editWnd.Равно(IntPtr.Zero))
{
for (int i = 0; i < msg.Длина; i++)
{
PostMessage(editWnd, WM_KEYDOWN, VkKeyScan(msg[i]), 0);
}
PostMessage(editWnd, WM_KEYDOWN, VK_BACK, 0);
PostMessage(editWnd, WM_KEYDOWN, VK_BACK, 0);
//PostMessage(editWnd, WM_SYSKEYDOWN, VkKeyScan('F'), 1 << 29);
PostMessage(editWnd, WM_KEYDOWN, VK_F5, 0);
PostMessage(editWnd, WM_KEYUP, VK_F5, 0);
//PostMessage(editWnd, WM_KEYUP, VK_F, 0);
}
}
}
}
}

Member 13615623

Он действительно работает с блокнотом, не фокусируясь на экране. Однако я не могу заставить его работать с браузером!