Announcement

Collapse
No announcement yet.

Paint Event auf externen Prozess

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Paint Event auf externen Prozess

    Hallo zusammen,

    kann mir jemand weiterhelfen ?
    ich möchte ein Event abfangen auf WM_Paint

    Mit:
    Code:
       public IntPtr GetWindowHandle(string processNamePart)
            {
                System.Diagnostics.Process[] processes = System.Diagnostics.Process.GetProcesses();
                foreach (System.Diagnostics.Process p in processes)
                {
                    if (p.MainWindowTitle.Contains(processNamePart))
                        return p.MainWindowHandle;
                }
    
                return new IntPtr(0);    // nicht gefunden
            }
    erhalte ich den Handle und
    kann auch z.B. über
    Code:
      [DllImport("user32.dll", SetLastError = true)]
            static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);
    ganz gut die Position / Größe abfragen.

    Allerdings habe ich schon zig Möglichkeiten ausprobiert um die
    Code:
    public const int WM_PAINT = 0x000F;
    abzufangen per Event.
    mit
    Code:
     [System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand,  Name = "FullTrust")]
            protected override void WndProc(ref Message m)
            {
    
    
                switch (m.Msg)
                {
                    case WM_PAINT:
    
                        // Notify the form that this message was received.
                        // Application is activated or deactivated,
                        // based upon the WParam parameter.
                        Console.WriteLine(m.HWnd);
                      ;
    
                        break;
                }
                base.WndProc(ref m);
            }
    Erhalte ich leider nur die Message von meiner Form und eben nicht aus dem "exterenen" Fenster.

    Wäre super mir da ein bisserl auf die Sprünge zu helfen :-)
    Danke
    Vor 4,5 Millionen Jahren lernten ~wir~ aufrecht zu gehen!
    Um heute vorm PC zu sitzen!

  • #2
    An die Message Queue kommst du nur für deine eigenen Prozess(genau eigentlich nur für den eigenen Thread). Um an die MessageQueue eines anderen Prozesses zu kommen brauchst du einen sogenannten WindowHook. https://docs.microsoft.com/de-de/win...windowshookexw

    Kurzfassung.
    Man kann damit eine DLL in einen anderen Prozess injizieren und eine Methode festlegen (aus dieser Dll) an die bestimmte Events weitergeleitet werden. Macht man schonmal für Maus&Keyboard Events man kann sich aber auch an eine MessageQueue hängen (WH_CallWndProc oder WH_CallWndProcRet).
    Und an der Stelle wird klar das man das eher nicht mit C# oder einer anderen .Net Sprache macht. Der andere Prozess wird in einer bestimmten Bittigkeit und eher ohne .Net Framework laufen. Und wenn mit .Net Framework dann voraussichtlich mit einer anderen Version als du dein Dll erzeugen würdest.

    Sinnvoll wird das ganze nur wenn die Dll unmanaged ist (also nicht in .Net geschrieben).








    Comment

    Working...
    X