Laden...

Forenbeiträge von page99 Ingesamt 5 Beiträge

13.08.2020 - 09:20 Uhr

Aber verstehe ich das falsch, wenn man ein DI-Framework verwendet, benötigt man doch zusätzlich den passenden Konstruktor (im Codebehind dafür)?

Dafür gibt es MVVM Frameworks. Caliburn Micro benutzt dafür ein ViewLocator und binded die View an das entsprechende ViewModel. (Siehe ViewLocator Conventions )

Im Bootstrapper kann man seinen eigenen IOC Container setzen und ruft nur noch


       protected override void OnStartup(object sender, StartupEventArgs e) 
       {
            DisplayRootViewFor<ShellViewModel>();
       }

auf und der Rest funktioniert von alleine 😃

18.07.2020 - 13:07 Uhr

Hallo blizzard,

ändere einfach dein Code folgendermaßen um:



var news = JsonConvert.DeserializeObject<List<News>>(json);


Damit klappt es. 😃

Schönes WE.

07.12.2018 - 09:35 Uhr

Hallo jok3r89,

die Funktion WithAssembly durchsucht die angegebene Assembly nach Import/Exports Attributen und registriert diese. Die Fehlermeldung deutet auf eine Mehrfachregistrierung hin.

Fehlermeldung:
"**Only one export **for the contract 'IServiceProvider' is allowed, but the following parts: 'SystemCompositionServiceProvider', 'SystemCompositionServiceProvider' export it."

Befinden sich MainView und MainViewModelBase in der gleichen Assembly?

Cheers.

23.11.2018 - 10:47 Uhr

Hallo Thomas,

ich habe mir das Projekt gerade nochmal auf Arbeit geladen und ausprobiert. Hier funktioniert es ebenfalls. Sowohl auf Arbeit als auch Privat ist Windows 10 im Einsatz. Folgende Möglichkeiten fallen mir auf Anhieb ein.

  • Antiviren Programm könnte es blockieren
  • Programm als Admin starten
  • EasyHook selber durchkompilieren
  • sicherstellen das alle benötigten EasyHook DLL's/Exe vorhanden sind
    (EasyHook64.dll, EasyHook64Svc.exe, EasyLoad64.dll)

Edit: In den Github Issues wird der Fehler 15 beschrieben

code 15 means it was unable to install the EasyLoad32/64.dll and then call the Loader.Load export for some reason. Usually this is because the target is incompatible with the .NET version you are using (i.e. try .NET 3.5 instead of .NET 4 or vice versa).

oder

There is another situation where Code 15 occurs, which is if the AppDomain.CreateDomain fails within EasyLoad32/64.dll.

I have found that AppDomain.CreateDomain will fail with an OutOfMemoryException when the executable stack commit size is larger than or equal to approximately 0x40000 (on my machine anyway). This can occur because native linking allows the developer to specify the stack reserve and commit size.

Link zum Issue: Injecting assembly into application using EasyHook

12.11.2018 - 11:34 Uhr

Hallo 123thomas,

wir hatten ja bereits kurz geschrieben um die Anforderungen noch einmal deutlich zu machen.
Die Applikation soll im Hintergrund laufen und unter folgenden Bedingungen in
den Vordergrund kommen:

  1. Applikation ist im Systray
  2. Linke Maustaste muss X Sekunden gedrückt sein
  3. Es wurde ein Ordner / Datei geklickt
  4. Drag Event wurde ausgelöst

Die 1. Bedingung ist natürlich einfach umzusetzen und Bedarf keine weitere Erklärung.

Für die 2. Bedingung benötigen wir einen globalen Mouse Hook um den Linken Mausklick abzufangen.
In .NET gibt es ingesamt nur 2 Globale Hooks die wir anwenden können. (Mouse und Keyboard)
Siehe dazu "How to set a windows hook in c# .net"

Das ganze ergänzen wir mit Timer/Stopwatch und können so die Zeit abfangen.

Als nächstes kommt die Überprüfung ob eine Datei / Ordner angeklickt wurde.
Stackoverflow hatte zum Glück bereits eine entsprechende Methode parat.
how-to-get-windows-explorers-selected-files-from-within-c


        private bool IsFileOrFolderSelected()
        {
            IntPtr handle = User32Interop.GetForegroundWindow();

            var shell = new Shell32.Shell();
            foreach (SHDocVw.InternetExplorer window in shell.Windows())
            {
                if (window.HWND == (int)handle)
                {
                    Shell32.FolderItems items = ((Shell32.IShellFolderViewDual2)window.Document).SelectedItems();
                    if (items.Count > 0)
                        return true;
                }
            }

            return false;
        }

Durch diese Methode wird dann z.B. auch der Scrollbalken ignoriert.

Kommen wir nun zum letzten und schwierigsten Punkt. Das Drag Event abfangen.
Das Drag Event wird im Explorer nicht über WM_* Messages umgesetzt. Aus diesem
Grund ist es auch nicht möglich das ganze über SetWindowHookEx umzusetzen.

Der Explorer benutzt intern die uralte OLE Schnittstelle. Um diese Schnittstelle
zu hooken benötigen wir IAT Hooking (Siehe Links von Th69) oder Detouring.
EasyHook bietet hier zum Glück alles was wir brauchen.

Dein letztes Beispiel hat aus folgenden Grund nicht funktioniert:
Du setzt den lokalen Hook nur für deine Applikation. Wir benötigen aber einen Remote Hook,
nämlich im Explorer. Da der Code den Rahmen sprengen würde, habe ich im Anhang mein Projekt
angehängt.

Paar offene Punkte:

Das ganze ist von mir nur eine Quick&Dirty Solution. Bitte achte bei der Verwendung in Produktion
auf das Freigeben sämtlicher Ressourcen. Die explorer.exe PID wird im Code gesetzt. (Siehe Form1.cs Funktion InjectIntoExplorer).
Die Solution muss unter x64 gebaut werden und über NuGet Restore die EasyHook Dll's/exe nachgeladen werden.

Cheers 😃