Есть программа, которая по нажатию на пробел рисует 10 красных квадратов на активном окне. При компиляции из Visual Studio все отрабатывает нормально. Появляется форма, я жму на пробел, на форме рисуются квадраты. Сохраняю проект в dll.
Теперь я хочу закинуть эту библиотеку в другой процесс. Через Cheat Engine делаю инъекцию в internet explorer. Она проходит успешно. Через visual studio проверял, dll занята процессом эксплорера. Однако формы никакой нету и при нажатии на пробел никакие квадраты не рисуются. Собственно что надо сделать, чтобы так работало?
Код прикладываю, сильно не пинайте, первый раз с C# столкнулся, постарался подробно прокомментировать, что я там делаю.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;
using System.Runtime.InteropServices;
namespace BotTest
{
public partial class Form1 : Form
{
[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool CloseHandle(IntPtr hObject);
[DllImport("kernel32.dll")]
internal static extern IntPtr OpenProcess(int dwDesiredAccess, bool bInheritHandle, int dwProcessId);
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);
[DllImport("user32.dll")]
public static extern IntPtr GetForegroundWindow();
[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
public int Left;
public int Top;
public int Right;
public int Bottom;
}
public Form1()
{
InitializeComponent();
}
private void DrawTest(IntPtr hwnd, IntPtr handle) //Функция для рисования квадратов
{
Random rand = new Random(); //Переменная для создания случайных значений
int x, y; //Координаты будущих квадратов
GetWindowRect(hwnd, out RECT rc); //Получение размеров окна
for (int i = 1; i<=10; i++)
{
Graphics newGraphics = Graphics.FromHwnd(hwnd); //Задаем отрисовку в окне, которое прилетело с параметров
x = rand.Next(rc.Right - rc.Left - 25); //Делаем случайные координаты
y = rand.Next(rc.Bottom - rc.Top - 25);
newGraphics.DrawRectangle(new Pen(Color.Red, 40), x, y, 25, 25); //Рисуем квадрат. Толщина больше половины стороны, значит закрасится полностью
newGraphics.Dispose();
}
}
private void button1_Click(object sender, EventArgs e) //При нажатии на эту кнопку будет рисоваться 10 квадратов
{
try
{
int pID = Process.GetCurrentProcess().Id; //Берем номер процесса, не понадобится
string pName = Process.GetProcessById(pID).ProcessName; //Берем имя процесса, тоже не нужно
IntPtr hwnd = GetForegroundWindow(); //Берем номер окна, по нему определем в каком окне рисовать
IntPtr handle = OpenProcess(0x001F0FFF, false, pID); //Берем ссылку на номер окна, тоже не нужно
CloseHandle(handle);
DrawTest(hwnd, handle); //Рисуем квадраты по hwnd, через handle не заработало
}
catch (Exception)
{
MessageBox.Show("Error button1");
}
}
private void button2_Click(object sender, EventArgs e) //Кнопка для закрытия текущего процесса
{
try
{
int pID = Process.GetCurrentProcess().Id; //Берем номер процесса
Process prc = Process.GetProcessById(pID); //По номеру создаем для него переменную
prc.Kill(); //И убиваем
}
catch(Exception)
{
MessageBox.Show("Error button2");
}
}
private void button1_KeyDown(object sender, KeyEventArgs e) //При нажатии на пробел вызывается 1-ая кнопка
{
if (e.KeyCode == Keys.Space)
{
button1_Click(sender, e);
}
}
}
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Добрый деньСтолкнулась с проблемой создания "своего" языка для вёрстки
Имею модифицированный TextBox под отображение IP адресаВ некоторых формах нужно делать его неактивным и только для чтения
Нужно просчитать траекторию движения персонажа после прыжка, чтобы именно к концу его движения заспавнить платформу, вообще ума не приложу...