Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
KExtensions v1.4 (Visual Studio Package) inkl. Sourcen
Sekkiy
myCSharp.de - Member



Dabei seit:
Beiträge: 21

beantworten | zitieren | melden

nein, ich habe nur die express edition :(
private Nachricht | Beiträge des Benutzers
Scavanger
myCSharp.de - Member

Avatar #avatar-3209.jpg


Dabei seit:
Beiträge: 309

beantworten | zitieren | melden

Hallo,

super Sache das Plugin..

Eine Sache ist mit aufgefallen: Im Kontextmenü des Explorer wirden z.B. die Erwiterungen von WinRAR oder meines Virenscanners angezeigt, nicht aber das von TortoiseSVN.
So könnt man sich ein extra SVN Plugin sparen.

using System;class H{static string z(char[]c){string r="";for(int x=0;x<(677%666);x++)r+=c[
x];return r;}static void Main(){int[]c={798,218,229,592,232,274,813,585,229,842,275};char[]
b=new char[11];for(int p=0;p<((59%12));p++)b[p]=(char)(c[p]%121);Console.WriteLine(z(b));}}
private Nachricht | Beiträge des Benutzers
Khalid
myCSharp.de - Experte

Avatar #avatar-2534.gif


Dabei seit:
Beiträge: 3.511
Herkunft: Hannover

Themenstarter:

beantworten | zitieren | melden

Hallo Scavanger,

ich habe jetzt noch mal meinen Code angeschaut und bin ziemlich fest der Meinung, das ich exakt die Kontextmenüeinträge erzeuge, die auch Windows erzeugt bei einem Rechtsklick.

Das TortoiseSVN jetzt trotzdem welche anzeigt, kann jetzt mehrere Gründe haben:
a)
TortoiseSVN liefert eine eigene ShellExtension mit, die die Menüeinträge dynamisch erzeugt bei einem Rechtsklick auf eine Datei. Möglichweise habe ich hier vergessen auf irgendwelche Events zu horchen, die vom System aus kommen.
b)
TortoiseSVN liefert gar einen eigenen Treiber mit, der sich zwischen Shell und Dateisystem hängt und dynamisch die Einträge erzeugt. Was aber echt der Hammer wär
c)
Die schaffen es irgendwie anders

Du könntest mir vielleicht ein wenig helfen. Schau mal bitte in der Registry nach, ob TortoiseSVN unter dem Schlüssel HKCR Einträge abgelegt hat, und wenn ja wo genau. Denn das "normale" Shellkontextmenü wird rein über die Registry erzeugt. Also alles was in der Registry steht, wird auch angezeigt.
"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)
private Nachricht | Beiträge des Benutzers
tom-essen
myCSharp.de - Experte

Avatar #avatar-2140.png


Dabei seit:
Beiträge: 1.815
Herkunft: NRW

beantworten | zitieren | melden

Hallo!

@Khalid:
Ich hab' mal nachgeschaut: In HKCR nistet sich TortoiseSVN unter den folgenden Pfaden ein:
  • HKCR/*/shellex/ContextMenuHandlers
  • HKCR/*/shellex/PropertySheetHandlers
  • HKCR/CLSID/{30351346-7B7D-4FCC-81B4-1E394CA267EB} (+8 weitere)
  • HKCR/Directory/Background/...
  • HKCR/Directory/shellex/...
  • HKCR/Folder/Background/...
  • HKCR/Folder/shellex/...

Hab' bestimmt noch ein paar übersehen.

Hoffe, das hilft dir weiter.

Kommentar: Mein 1.000 Post
Nobody is perfect. I'm sad, i'm not nobody
private Nachricht | Beiträge des Benutzers
Khalid
myCSharp.de - Experte

Avatar #avatar-2534.gif


Dabei seit:
Beiträge: 3.511
Herkunft: Hannover

Themenstarter:

beantworten | zitieren | melden

Hi,

danke sehr.

Auf den habe ich gehofft:

• HKCR/*/shellex/ContextMenuHandlers
• HKCR/Folder/shellex/...
Wenn unter den Einträgen bei "ContextMenuHandlers" das TortoiseSVN auftaucht, sollte es sich ganz normal in das Shell Contextmenü einklinken.

Scheint ja aber irgendwie nicht der Fall zu sein :(
Bleibt mir wohl nichts anderes übrig, als mal ein Tortoise zu installieren und zu schauen, was von der Shell direkt übergeben wird, wenn ich das Menü abfrage.

Das wird allerdings ein paar Tage dauern, bis ich dazu komme...
"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)
private Nachricht | Beiträge des Benutzers
Khalid
myCSharp.de - Experte

Avatar #avatar-2534.gif


Dabei seit:
Beiträge: 3.511
Herkunft: Hannover

Themenstarter:

beantworten | zitieren | melden

Hallo,

wollt nur mitteilen, das es voran geht. Die Version die ich jetzt demnächst rausgebe, kann dann mit sämtlichen Shell Erweiterungen umgehen (z.B. Context Menu Handler, Shell Icon Handler, usw...).

Im Anhang befindet sich ein Screenshot, in dem man TortoiseSVN in Aktion mit meinen Komponenten sieht. Ebenso ganz unten im Menu auch WinMerge (wurde vorher auch nie angezeigt).

Dadurch, das das ein wenig Änderungen bedeutet hat, muss ich jetzt einiges umstrukturieren. Deswegen dauert die Version leider noch etwas. Aber ich bemühe mich, das die Version vor Weihnachten da ist.
Attachments
"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)
private Nachricht | Beiträge des Benutzers
ujr
myCSharp.de - Experte



Dabei seit:
Beiträge: 1.688

beantworten | zitieren | melden

Zitat von Khalid
wollt nur mitteilen, das es voran geht. Die Version die ich jetzt demnächst rausgebe, kann dann mit sämtlichen Shell Erweiterungen umgehen (z.B. Context Menu Handler, Shell Icon Handler, usw...).

Mir wird jetzt schon TortoiseSVN angezeigt - XP SP3. Was noch fehlt, sind die Icon-Overlays.

Edit: auch WinMerge hab ich...
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von ujr am .
private Nachricht | Beiträge des Benutzers
t2t
myCSharp.de - Member



Dabei seit:
Beiträge: 415
Herkunft: Hamburg

beantworten | zitieren | melden

Zitat von Khalid
[...] Deswegen dauert die Version leider noch etwas. Aber ich bemühe mich, das die Version vor Weihnachten da ist.

Das klingt sehr gut. Ich verfolge die Änderungen an diesem Projekt immer sehr gespannt. Werden eigentlich auch die Punkte berücksichtigt, die ich mal am 27.08. gepostet hatte?
private Nachricht | Beiträge des Benutzers
Khalid
myCSharp.de - Experte

Avatar #avatar-2534.gif


Dabei seit:
Beiträge: 3.511
Herkunft: Hannover

Themenstarter:

beantworten | zitieren | melden

Hi,
Zitat
Werden eigentlich auch die Punkte berücksichtigt, die ich mal am 27.08. gepostet hatte?
Ja, wurden sogar schon umgesetzt :). Ich habe dazu das komplette Drag & Drop neu schreiben müssen, damit dieses jetzt besser mit der Shell interagiert und auch mit sich selber besser interagiert. In der jetztigen öffentlichen Version ist das ein wenig "Misch-Masch" zwischen Shell D&D und eigenes D&D. In der neuen Version geht dann alles über die Shell. Was die Sache sogar wesentlich vereinfacht in Hinblick auf verschiedene OS Versionen (XP/V/W7). Jetzt erledigt alles die Shell und ich muss nur noch auf die Events horchen :)
"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)
private Nachricht | Beiträge des Benutzers
t2t
myCSharp.de - Member



Dabei seit:
Beiträge: 415
Herkunft: Hamburg

beantworten | zitieren | melden

Klingt sehr geil. Ein Grund mehr mich auf das neue Release zu freuen ;o)
private Nachricht | Beiträge des Benutzers
Khalid
myCSharp.de - Experte

Avatar #avatar-2534.gif


Dabei seit:
Beiträge: 3.511
Herkunft: Hannover

Themenstarter:

beantworten | zitieren | melden

Verzögert sich leider wegen: Seltsames verhalten der Windows Shell unter Visual Studio
"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)
private Nachricht | Beiträge des Benutzers
Khalid
myCSharp.de - Experte

Avatar #avatar-2534.gif


Dabei seit:
Beiträge: 3.511
Herkunft: Hannover

Themenstarter:

beantworten | zitieren | melden

Hallo,

dank ujr konnte ich die Version doch jetzt schon fertig machen. Hat sich im Prinzip nicht viel getan (viele interne Änderungen und Umstrukturierungen). Siehe erster Beitrag.
"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)
private Nachricht | Beiträge des Benutzers
t2t
myCSharp.de - Member



Dabei seit:
Beiträge: 415
Herkunft: Hamburg

beantworten | zitieren | melden

Hallo Khalid,

hast du auch die Sourcen der Version 1.4 veröffentlicht? Ich konnte auf deinem Blog nur die der 1.3 finden.
private Nachricht | Beiträge des Benutzers
Khalid
myCSharp.de - Experte

Avatar #avatar-2534.gif


Dabei seit:
Beiträge: 3.511
Herkunft: Hannover

Themenstarter:

beantworten | zitieren | melden

Hi,

sorry das hab ich voll verpennt. Die Sourcen auf meinem Blog habe ich aktualisiert. Sind jetzt die Neuesten.
"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)
private Nachricht | Beiträge des Benutzers
t2t
myCSharp.de - Member



Dabei seit:
Beiträge: 415
Herkunft: Hamburg

beantworten | zitieren | melden

Super. Vielen Dank! Dann mach ich mich mal demnächst ans testen der neuen Version ;o)
private Nachricht | Beiträge des Benutzers
t2t
myCSharp.de - Member



Dabei seit:
Beiträge: 415
Herkunft: Hamburg

beantworten | zitieren | melden

Hallo Khalid,

ich hab nun die neue Komponente eingehens getestet. Vorweg erstmal: super Arbeit. Wie schon die Version 1 mit der ich sehr zufrienden war, konnte dieses Update einiges neues rausholen. Dennoch sind mir einige Punkte aufgefallen, an denen ich teilweise mich auch schon versucht habe. Daher hier ein Feedback von mir:
  • Ich nutze Win XP und mir ist aufgefallen, dass die ShellMethods.SHGetFileInfo äußerst unperformant läuft. Ich habe das gegen die ursprünglichen Einstellungen der Version 1 deines ShellListViews verglichen und dann einfach die selben Flags aus Version 1 ausprobiert. Siehe da, die Perfomance verzehnfachte sich in etwa:

    Ich habe dies:

    
    ShellMethods.SHGetFileInfo(fullPidl.Ptr, 0, ref info, Marshal.SizeOf(typeof(SHFILEINFO)),
              SHGFI.PIDL | 
              SHGFI.TYPENAME |
              SHGFI.SYSICONINDEX |
              SHGFI.ICON |
              SHGFI.OVERLAYINDEX);
    
    gegen dies ausgetauscht:

    
    ShellMethods.SHGetFileInfo(fullPidl.Ptr, 0, ref info, Marshal.SizeOf(typeof(SHFILEINFO)),
                SHGFI.PIDL | SHGFI.TYPENAME | SHGFI.SYSICONINDEX);
    

    Lag das daran, dass diese Einstellungen für Win 7 gedacht sind?

  • Das Drag & Drop funktioniert nicht wie im normalen Win Explorer. Ein äußerst unangenehmer Effekt tritt auf, wenn man eine oder mehrere Dateien nur kurz zieht, die Maus dann aber im selben Ordner wieder los lässt. Die ShellListView (ich glaub auch die ShellTreeView) interpretieren diese Aktion als Kopie. Was aber falsch ist, der normale Explorer macht in diesem Fall garnichts. Kopiert werden dürfte innerhalb des gleichen Ordners nur mit gedrückter STRG Taste. Ich bin nicht zu 100% durch deine eingesetzte Drag&Drop Funktionalität gestiegen. Soweit ich das erkennen kann, wird alles im ShellBaseListView behandelt, obwohl auch die ShellListView noch Implementierungen dazu hat, die aber nie in Kraft treten. Ich hab mich nun mit einem wahrscheinlich recht unschönen Workaround beholfen. Dazu habe ich insbesondere die GetDragDropsEffects Funktion erweitert:

    
    private DragDropEffects GetDragDropEffects(MK keyState, ShellListViewItem lvi)
    {
    	if (keyState == (keyState | MK.CONTROL))
    	{
    		return DragDropEffects.Copy;
    	}
    		else if (keyState == (keyState | MK.ALT))
    	{
    	r	eturn DragDropEffects.Link;
    	}
    		else if (keyState == (keyState | MK.SHIFT))
    	{
    		return DragDropEffects.Move;
    	}
    	else
    	{
    		if ((lvi != null && lvi.ShellItem.IsFolder) || !_listViewDropAction)
    			return DragDropEffects.Copy;
    		else
    			return DragDropEffects.None;
    	} 
    }
    

    Jetzt wird nur kopiert, wenn das Ziel auf das gezogen wird ein Ordner ist. Oder die DragDrop Aktion nicht aus dem ShellListView gestartet wurde, sondern z.B. aus dem echten Win Explorer. Dazu habe ich einfach eine boolsche Klassenvariable _listViewDropAction eingeführt, die im OnItemDrag auf true gesetzt wird (da es sich um eine DragDrop Aktion innerhalb des Steuerelements handelt) und im KControls.WinForms.Shell.IDropTarget.DragDrop wieder auf false gesetzt wird, wenn die Aktion innhalb des Steuerelements beendet wurde.

  • Wenn man ein ShellListViewItem anklickt und die Taste F2 zum unbennen drückt, wird trotzdem noch auf alle weiteren Tastenanschläge reagiert. Das bedeutet z.B. wenn man den Dateinamen editieren möchte und dabei die Entf Taste drückt, erscheint der Dialog zum löschen der Datei. Dies hab ich auch einfach mit einer boolschen Klassenvariable gelöst, die beim editieren eines Items gesetzt wird und somit die anderen Tastenanschläge verhindert.

  • Nun zu dem Problem was ich selber noch nicht zufriedenstellend hab lösen können, was daran liegen mag, dass ich nicht ganz verstanden habe wie du auf die Windowsnachrichten reagierst und diese dann verarbeitest. Auf jedenfall scheint da noch der Wurm drin zu sein. Wenn man z.B. eine etwas größere Anzahl von Dateien markiert, und diese löscht wird die Aktion korrekt ausgeführt, nur wird die ShellListView nicht korrekt aktualisierst. Meistens verschwinden dann nur ein paar der gelöschten ListViewItem, die restlichen bleiben stehen, obwohl das Dateisystem sie schon gelöscht hat. Das selbe tritt bei verschiebe Aktionen auf, oder auch wenn man eine Datei über den normalen Win Explorer umbenennt kriegt die ShellListView das nicht immer "on-the-fly" mit, sondern man muss teilweise erst den Ordner refreshen. Hast du ne Ahnung woran das liegen kann und wie man das fixxen könnte? Denn soweit ich das jetzt sehe wären dann fast alle wichtigen Explorer Eigenschaften fehlerfrei implementiert.

Ich hoffe dieses Feedback hilft dir und vielleicht hast du ja auch ne Lösung für den letzten Punkt oder Ideen, wie man meine Ansätze eleganter verbessern kann.
private Nachricht | Beiträge des Benutzers
TBR
myCSharp.de - Member



Dabei seit:
Beiträge: 154

beantworten | zitieren | melden

Ich hab hier mal noch 2 Fehler und ein Verbesserungsvorschlag:

Fehler
  • Man kann in der ListView im "Windows Explorer" nicht per "Rücktaste" o.ä. eine Ebene nach oben
  • Die TreeView im Windows Explorer geht nicht automatisch mit, wenn man in der ListView in einen Ordner weiterklickt

Verbesserung
  • "Favoriten" im Windows Explorer: Man kann Ordner in eine Liste einfügen, damit man diese schneller erreichen kann


Und: Echt klasse das Ding ;) Kann ich immer wieder brauchen :)

MfG
TBR
private Nachricht | Beiträge des Benutzers
Khalid
myCSharp.de - Experte

Avatar #avatar-2534.gif


Dabei seit:
Beiträge: 3.511
Herkunft: Hannover

Themenstarter:

beantworten | zitieren | melden

Hallo,

danke für euer Feedback.

Ich geh die Liste mal durch :)
@t2t:
a)
Was die Performance wahrscheinlich ausbremst, ist die Kombination SHGFI.ICON | SHGFI.OVERLAYINDEX. Diese ermittelt das Icon, welches über dem eigentlichen Icon gezeichnet werden soll (z.B. Freigaben, Tortoise SVN und andere). Dadurch das das System zusätzlich eine Abfrage gegen die Registry, bzw. den lokalen Icon Cache, setzt, kommt es hier wahrscheinlich zu den Performanceeinbußen.

Dies ist jetzt momentan nur eine Vermutung. Muss ich aber selber nochmal prüfen.

b)
Ist mir so direkt noch gar nicht aufgefallen :)
Das Problem ist nur, das auch bestimmte Dateien als "Container" angesehen werden (z.B. ZIP, MSI Dateien). Die Prüfung müsste also dementsprechend in das DragDrop verlegt werden. Da guck ich mir mal eine Lösung aus :)

c)
Würde ich jetzt genauso machen.

d)
Tja, den kann ich mir auf anhieb überhaupt nicht erklären. Da muss ich mal den gesamten Nachrichtenverkehr überwachen und schauen was da schief gehen könnte. Auf meiner Seite, könnte es vielleicht ein Problem mit der synchronisation sein.

Aber die Fehlersuche wird interessant :)


@TBR
a)
Das mit der Rücktaste steht schon länger auf meinem ToDo. Irgendwie verpenn ich das jedesmal. Hab es jetzt von der Priorität mal höher geschoben, sonst überseh ich den immer :)

b)
Da schau ich mal nach.

Zu deinem Verbesserungsvorschlag:
Diese Idee hatte ich auch schonmal. Nur dann hatte ich W7 installiert und bin zu dem Schluss gekommen, das es ab W7 kein Sinn mehr macht, da es jetzt die Bibliotheksordner gibt.

Darum geh ich jetzt mal davon aus, das du noch nicht mit W7 gearbeitet hast, oder du dieses Feature bis jetzt übersehen hast (ist mir auch passiert).

Order meinst du was anderes?


Gruß
Khalid
"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)
private Nachricht | Beiträge des Benutzers
t2t
myCSharp.de - Member



Dabei seit:
Beiträge: 415
Herkunft: Hamburg

beantworten | zitieren | melden

Moin,

dann bin ich mal gespannt was du rausfinden wirst ;o) Hier schonmal ne kleine Unterstützung für die ProcessCmdKey Funktion, um die Tasten besser zu unterstützen, u.a. auch die Rücktaste:


case Keys.F5: // Refresh
{
	RefreshCurrentFolder();

	break;
}
case Keys.Back: // Rücktaste
{
	if (this.CurrentShellItem.Parent != null)
		ChangeFolder(this.CurrentShellItem.Parent);

	break;
}
case Keys.Enter: // Ausführen
{
	if (SelectedItems.Count > 0)
	{
		ShellListViewItem lvi = SelectedItems[0];

		ShellItem item = lvi.ShellItem;

		if (item.IsFolder)
		{
			// Bei einem Ordner, wird der Ordner geöffnet
			if (OnFolderChanging(item))
			{
				ChangeFolder(item);
				OnFolderChanged(item);
			}
		}
		else
		{
			// Bei jedem anderen ShellItem, wird die Defaultaktion ausgelöst
			if (OnItemExecuting(item))
			{
			  ShellContextMenu.ExecuteDefaultAction(item);
			  OnItemExecuted(item);
			}
		}
	}
	
	break;
}
private Nachricht | Beiträge des Benutzers