Окно печати не захватывает в онлайн игре - PullRequest
0 голосов
/ 16 ноября 2018

Я пытаюсь создать простую программу автоматического доступа. Захват с этим кодом сохраняет только серую картинку. Что я должен делать? Другие программы, которые не являются играми, фиксируются нормально. Это из-за программы безопасности? И я попытался ввести клавиатуру в эту игру, но она совсем не работает.

  • SendKeys.SendWait ( "W")
  • SendKeys.Send ( "W")
  • InputSimulator
  • SendInput
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.IO;
using System.Threading;
using System.Runtime.InteropServices;
using System.Diagnostics;
using System.Drawing.Imaging;

namespace WindowsFormsApp2
{

public partial class Form1 : Form
{
        [System.Runtime.InteropServices.DllImport("User32", EntryPoint = "FindWindow")]
    private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
    String AppPlayerName = "LOST ARK (64-bit) v.1.0.1.3";

    [DllImport("user32.dll", SetLastError = true)]

    [return: MarshalAs(UnmanagedType.Bool)]

    static extern bool PrintWindow(IntPtr hwnd, IntPtr hDC, uint nFlags);



    [DllImport("user32.dll", SetLastError = true)]

    static extern int GetWindowRgn(IntPtr hWnd, IntPtr hRgn);



    [DllImport("gdi32.dll")]

    static extern IntPtr CreateRectRgn(int nLeftRect, int nTopRect, int nRightRect, int nBottomRect);


    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        IntPtr findwindow = FindWindow(null, AppPlayerName);
        if (findwindow != IntPtr.Zero)
        {
            Debug.WriteLine("Found.");
            Debug.WriteLine(findwindow.ToString());
            PrintWindow(findwindow);
        }
        else
        {
            Debug.WriteLine("Not Found");
        }
    }

    public static void PrintWindow(IntPtr hwnd)

    {

        Rectangle rc = Rectangle.Empty;

        Graphics gfxWin = Graphics.FromHwnd(hwnd);

        rc = Rectangle.Round(gfxWin.VisibleClipBounds);

        Bitmap bmp = new Bitmap(rc.Width, rc.Height, PixelFormat.Format32bppArgb);

        Graphics gfxBmp = Graphics.FromImage(bmp);

        IntPtr hdcBitmap = gfxBmp.GetHdc();

        bool succeeded = PrintWindow(hwnd, hdcBitmap, 1);

        gfxBmp.ReleaseHdc(hdcBitmap);

        if (!succeeded)

        {

            gfxBmp.FillRectangle(

                new SolidBrush(Color.Gray),

                new Rectangle(Point.Empty, bmp.Size));

        }

        IntPtr hRgn = CreateRectRgn(0, 0, 0, 0);

        GetWindowRgn(hwnd, hRgn);

        Region region = Region.FromHrgn(hRgn);

        if (!region.IsEmpty(gfxBmp))

        {

            gfxBmp.ExcludeClip(region);

            gfxBmp.Clear(Color.Transparent);

        }

        gfxBmp.Dispose();

        bmp.Save(Application.StartupPath + "1.bmp", System.Drawing.Imaging.ImageFormat.Bmp);

    }

    private void Form1_Load(object sender, EventArgs e)
    {

    }
}

}

1 Ответ

0 голосов
/ 16 ноября 2018

Игры не используют GDI для отображения контента. Ваша программа создает объект GDI (Graphic) и копирует содержимое из него. Но в играх и 3d редакторах используются DirectX, OpenGL или любой другой прямой доступ к видео. Они обходят уровень GDI.

В старые времена это называлось театральным режимом.

Пожалуйста, используйте эту статью, когда игра использует DirectX:

https://social.msdn.microsoft.com/Forums/vstudio/ru-RU/c582109f-6b6f-4d5a-9b47-720145d21411/capture-screenshots-of-fullscreen-directx-games-in-c?forum=Offtopic

...