C# DLL ile ekrana yazı yazma

Archley

Kilopat
Katılım
18 Ekim 2020
Mesajlar
2.940
Makaleler
2
Çözümler
30
Programa inject edince mesela yanda 1234 yazacak ve programın arayüzünde kalacak. Bunu nasıl yapabilirim?
 
Son düzenleyen: Moderatör:
C#'da dynamic library kullanmak için System.Runtime.InteropServices kullanabilirsiniz ama soruyu anlamadım.

DLL'deki fonksiyonların tanımlarını bilmeniz lazım:
C#:
[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern int MessageBox(IntPtr hWnd, String text, String caption, uint type);
fonksiyonlar bu şekilde tanımlanıp çağırılabilir.
 
Mesela DLL ile bu şekilde ekrana yazı yazıyor.
1654368559099.png
 
Programa doğrudan yazmanız mümkün değil. Windows, istek üzerine çizim yapar ve siz programın adresine yüklemeyi yapsanız bile WM_PAINT olayında çiziminiz zaten yok olur.

Bunu yapmanın mantıklı yolu saydam ve tıklanamaz bir pencere oluşturup ona çizim yapmaktır. Aşağıdaki kod StackOverflow'dan alıntı olup açık pencerenin üstünde sarı bordera sahip görünmez bir pencere oluşturur. Onun üzerine çizim yapar.
Kod:
static class Program
{
    [STAThread]
    static void Main()
    {
        var overlay = new Overlay();

        // track windows open (requires WindowsBase, UIAutomationTypes, UIAutomationClient)
        Automation.AddAutomationEventHandler(WindowPattern.WindowOpenedEvent, AutomationElement.RootElement, TreeScope.Subtree, (s, e) =>
        {
            var element = (AutomationElement)s;
            if (element.Current.ProcessId != Process.GetCurrentProcess().Id)
            {
                Console.WriteLine("Added window '" + element.Current.Name + "'");
                overlay.AddTrackedWindow(element);

                // track window close
                Automation.AddAutomationEventHandler(WindowPattern.WindowClosedEvent, element, TreeScope.Element, (s2, e2) =>
                {
                    overlay.RemoveTrackedWindow(element);
                });
            }
        });

        Application.Run(overlay);
    }
}

// adapted from https://stackoverflow.com/questions/11077236/transparent-window-layer-that-is-click-through-and-always-stays-on-top
public class Overlay : Form // standard Windows Form
{
    private readonly HashSet<AutomationElement> _windows = new HashSet<AutomationElement>();

    public Overlay()
    {
        TopMost = true;
        FormBorderStyle = FormBorderStyle.None;
        WindowState = FormWindowState.Maximized;
        MaximizeBox = false;
        MinimizeBox = false;
        ShowInTaskbar = false;
        BackColor = Color.White;
        TransparencyKey = BackColor;
    }

    protected override CreateParams CreateParams
    {
        get
        {
            var cp = base.CreateParams;
            const int WS_EX_TRANSPARENT = 0x20;
            const int WS_EX_LAYERED = 0x80000;
            const int WS_EX_NOACTIVATE = 0x8000000;
            cp.ExStyle |= WS_EX_LAYERED | WS_EX_TRANSPARENT | WS_EX_NOACTIVATE;
            return cp;
        }
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);

        foreach (var window in _windows.ToArray())
        {
            Rect rect;
            try
            {
                rect = window.Current.BoundingRectangle;
            }
            catch
            {
                // error, window's gone
                _windows.Remove(window);
                continue;
            }

            // draw a yellow rectangle around window
            using (var pen = new Pen(Color.Yellow, 2))
            {
                e.Graphics.DrawRectangle(pen, (float)rect.X, (float)rect.Y, (float)rect.Width, (float)rect.Height);
            }
        }
    }

    // ensure we call Invalidate on UI thread
    private void InvokeInvalidate() => BeginInvoke((Action)(() => { Invalidate(); }));

    public void RemoveTrackedWindow(AutomationElement element)
    {
        _windows.Remove(element);
        InvokeInvalidate();
    }

    public void AddTrackedWindow(AutomationElement element)
    {
        _windows.Add(element);
        InvokeInvalidate();

        // follow target window position
        Automation.AddAutomationPropertyChangedEventHandler(element, TreeScope.Element, (s, e) =>
        {
            InvokeInvalidate();
        }, AutomationElement.BoundingRectangleProperty);
    }
}
 
Dediğiniz şey C++, C ile yapılabilir ama C# ile başka bir Process'e inject edilebilecek bir DLL yapamazsınız.
İlk arkadaşın attığı dllımport komutu ise C, C++ dillerinden oluşan kütüphaneyi kullanmak içindir yakından uzaktan alakası yok.

Zaten bu yüzden C# ile inject edilen hileler yapılamaz, yapılanlar ya overlay form olur ya da direkt olarak form olur. Dediğiniz için C++, C gibi dillere başlayın.
 
Dediğiniz şey C++, C ile yapılabilir ama C# ile başka bir Process'e inject edilebilecek bir DLL yapamazsınız.
İlk arkadaşın attığı dllımport komutu ise C, C++ dillerinden oluşan kütüphaneyi kullanmak içindir yakından uzaktan alakası yok.

Zaten bu yüzden C# ile inject edilen hileler yapılamaz, yapılanlar ya overlay form olur ya da direkt olarak form olur. Dediğiniz için C++, C gibi dillere başlayın.
Benim amacım hile değil sadece ekrana yazı yazıcam. Scusty yazıcam filigran eklemekten daha rahat oluyor.
 

Technopat Haberler

Yeni konular

Yeni mesajlar

Geri
Yukarı