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 😃
Hallo blizzard,
ändere einfach dein Code folgendermaßen um:
var news = JsonConvert.DeserializeObject<List<News>>(json);
Damit klappt es. 😃
Schönes WE.
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.
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.
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
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:
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 😃