Вопрос C# отправить клик в свернутое окно, при этом чтобы окно не разворачивалось.

Начинающий
Статус
Оффлайн
Регистрация
20 Фев 2023
Сообщения
3
Реакции[?]
0
Поинты[?]
0
моя функция отправки клика:

моя функция отправки клика::
public static void SendLeftClick(IntPtr hWnd, int x, int y)
{
const uint WM_LBUTTONDOWN = 0x0201;
const uint WM_LBUTTONUP = 0x0202;

IntPtr lParam = (IntPtr)((y << 16) | x);

SendMessage(hWnd, WM_LBUTTONDOWN, IntPtr.Zero, lParam);
SendMessage(hWnd, WM_LBUTTONUP, IntPtr.Zero, lParam);
}
Нужно что-то подобное, только чтобы можно было отправить в окно процесса, в кратце я пытаюсь сделать бота в свернутом режиме.
Нужно кликать по определенным координатам. Ещё возможно ли эмулировать нажатие клавишь в свернутое окно? У меня есть функция, но она работает опять же, когда разворачиваешь окно.

Много способов попробовал ничего не получается. Хелп 🙏

UPD. В ahk есть подобное решение функция ControlSend ((но как вставлять текст в окно/эмулировать нажатие клавишь, не знаю))
 
Assembler Genius?
Пользователь
Статус
Оффлайн
Регистрация
27 Июл 2020
Сообщения
378
Реакции[?]
64
Поинты[?]
2K
Ну во первых что бы ты мог работать в свёрнутом окне тебе как минимум нужно определять это окно с помощью FindWindow
Вот накидал тебе пример эмуляции клавиши в свёрнутом окне

Код:
using System;
using System.Runtime.InteropServices;

public class TestEmulationKey
{
    [DllImport("user32.dll")]
    static extern IntPtr FindWindow(string lpClassName, string lpWindowName); // ФУнкция про которую я говорил для определения окна

    [DllImport("user32.dll")]
    static extern IntPtr SetForegroundWindow(IntPtr hWnd);

    [DllImport("user32.dll")]
    static extern bool PostMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);

    static void Main()
    {
      
        IntPtr hWnd = FindWindow(null, "notepad");

      
        if (hWnd != IntPtr.Zero)
        {
            SetForegroundWindow(hWnd);
            const uint WM_KEYDOWN = 0x100;
            const uint WM_KEYUP = 0x101;
            const int VK_RETURN = 0x0D;
            PostMessage(hWnd, WM_KEYDOWN, VK_RETURN, 0);
            PostMessage(hWnd, WM_KEYUP, VK_RETURN, 0);
        }
 
    }
}
 
Эксперт
Статус
Оффлайн
Регистрация
9 Апр 2020
Сообщения
1,422
Реакции[?]
661
Поинты[?]
20K
Есть на крестах
C++:
PostMessage(GameHandle, WM_LBUTTONDOWN, WM_LBUTTONDOWN, NULL);
Sleep(MOUSE_PRESS_DELAY);
PostMessage(GameHandle, WM_LBUTTONUP, WM_LBUTTONUP, NULL);
 
Начинающий
Статус
Оффлайн
Регистрация
20 Фев 2023
Сообщения
3
Реакции[?]
0
Поинты[?]
0
Ну во первых что бы ты мог работать в свёрнутом окне тебе как минимум нужно определять это окно с помощью FindWindow
Вот накидал тебе пример эмуляции клавиши в свёрнутом окне

Код:
using System;
using System.Runtime.InteropServices;

public class TestEmulationKey
{
    [DllImport("user32.dll")]
    static extern IntPtr FindWindow(string lpClassName, string lpWindowName); // ФУнкция про которую я говорил для определения окна

    [DllImport("user32.dll")]
    static extern IntPtr SetForegroundWindow(IntPtr hWnd);

    [DllImport("user32.dll")]
    static extern bool PostMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);

    static void Main()
    {
     
        IntPtr hWnd = FindWindow(null, "notepad");

     
        if (hWnd != IntPtr.Zero)
        {
            SetForegroundWindow(hWnd);
            const uint WM_KEYDOWN = 0x100;
            const uint WM_KEYUP = 0x101;
            const int VK_RETURN = 0x0D;
            PostMessage(hWnd, WM_KEYDOWN, VK_RETURN, 0);
            PostMessage(hWnd, WM_KEYUP, VK_RETURN, 0);
        }

    }
}
В свернутом у меня получилось сделать,вот этим способом. Теперь появился вопрос как сделать, чтобы работало в неактивном окне.У меня два монитора и я хочу чтобы на одном была игра, а на втором я занимался своими делами. Эта функция уже не работает при таком сценарии.
 
Сверху Снизу