From b381f7a6fac161c9cc5d5a8a94b055b08db95a27 Mon Sep 17 00:00:00 2001 From: Akay Devel Coder <12538957+akaydev-coder@users.noreply.github.com> Date: Sat, 4 Jul 2026 16:26:43 +0200 Subject: [PATCH 1/6] Publish 1.5.79 stable --- CHANGELOG.md | 112 ++- CREDITS.md | 2 +- Installer/Bundle.wxs | 4 +- Installer/Installer.wxs | 6 +- Installer/config.ini | 13 + MinHook/libMinHook.vcxproj | 8 +- QTHookLib/ExplorerBackgroundRenderer.cpp | 734 ++++++++++++++++++ QTHookLib/ExplorerBackgroundRenderer.h | 21 + QTHookLib/QTHookLib.vcxproj | 4 + QTHookLib/ScopedBackgroundHooks.cpp | 189 +++++ QTHookLib/ScopedBackgroundHooks.h | 15 + QTHookLib/main.cpp | 76 +- QTTabBar/HookLibManager.cs | 89 ++- QTTabBar/ListViewMonitor.cs | 11 + QTTabBar/Properties/AssemblyInfo.cs | 4 +- QTTabBar/QTTabBarClass.cs | 4 + QTTabBar/QTUtility.cs | 2 +- QTTabBar/TaskbarTabPreviewManager.cs | 1 - README.md | 20 +- docs/releases/v1.5.64.0.md | 22 + docs/releases/v1.5.65.0.md | 18 + docs/releases/v1.5.66.0.md | 18 + docs/releases/v1.5.67.0.md | 17 + docs/releases/v1.5.68.0.md | 20 + docs/releases/v1.5.69.0.md | 19 + docs/releases/v1.5.70.0.md | 18 + native/QTTabBarNative/HookLibraryBridge.cpp | 102 ++- native/QTTabBarNative/HookLibraryBridge.h | 5 + native/QTTabBarNative/NativeExports.cpp | 29 + native/QTTabBarNative/QTTabBarNative.rc | 8 +- native/QTTabBarNative/QTTabBarNative.vcxproj | 13 + native/QTTabBarNative/QTTabBarNative_i.c | 4 +- native/QTTabBarNative/QTTabBarNative_i.h | 4 +- .../BackgroundRendererSmoke.vcxproj | 41 + .../Tests/BackgroundRendererSmoke/Smoke.cpp | 51 ++ 35 files changed, 1619 insertions(+), 85 deletions(-) create mode 100644 QTHookLib/ExplorerBackgroundRenderer.cpp create mode 100644 QTHookLib/ExplorerBackgroundRenderer.h create mode 100644 QTHookLib/ScopedBackgroundHooks.cpp create mode 100644 QTHookLib/ScopedBackgroundHooks.h create mode 100644 docs/releases/v1.5.64.0.md create mode 100644 docs/releases/v1.5.65.0.md create mode 100644 docs/releases/v1.5.66.0.md create mode 100644 docs/releases/v1.5.67.0.md create mode 100644 docs/releases/v1.5.68.0.md create mode 100644 docs/releases/v1.5.69.0.md create mode 100644 docs/releases/v1.5.70.0.md create mode 100644 native/Tests/BackgroundRendererSmoke/BackgroundRendererSmoke.vcxproj create mode 100644 native/Tests/BackgroundRendererSmoke/Smoke.cpp diff --git a/CHANGELOG.md b/CHANGELOG.md index 6b35c2d..4c15048 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,116 @@ # Changelog +## 1.5.79.0 Stable - 2026-07-04 + +- Promotes the exact-window `BeginPaint`/`FillRect` Explorer background renderer to production. +- Removes periodic managed diagnostics, native paint counters, obsolete draw exports, and diagnostic build markers. +- Retains strict `DirectUIHWND` validation, safe hook rollback, crash reporting, and operational error logs. + +## 1.5.78.0 Diagnostic - 2026-07-04 + +- Replaces the overwritten `WM_ERASEBKGND` draw with process API detours matching the proven ExplorerBgTool paint order. +- Draws immediately after DirectUI's own `FillRect`, before folders, files, and labels are painted. +- Restricts rendering to HDCs resolved to exact registered `DirectUIHWND` instances and fully rolls back partial hook installation. + +## 1.5.77.0 Diagnostic - 2026-07-04 + +- Moves exact-window background rendering from the post-paint overlay to `WM_ERASEBKGND`. +- Draws after the default background erase and before Explorer paints folders, files, and labels. +- Uses the message-provided HDC, removes the post-paint redraw loop, and keeps all IAT hooks disabled. + +## 1.5.76.0 Diagnostic - 2026-07-04 + +- Fixes exact-window registration for the hook-free after-paint renderer by checking the initialized renderer state rather than the obsolete installed-hook state. +- Preserves the 1.5.75 exact `DirectUIHWND` rendering path with all background IAT hooks disabled. + +## 1.5.75.0 Diagnostic - 2026-07-03 + +- Replaces background-mode IAT interception with exact-window rendering dispatched by QTTabBar's existing `DirectUIHWND` after-paint message. +- Uses the WinSpy-confirmed registered file-list window and disables all scoped background IAT hooks. +- Adds after-paint render telemetry while retaining the WIC image loader and strict window validation. + +## 1.5.74.0 Diagnostic - 2026-07-03 + +- Extends the isolated background renderer to scoped `FillRect` and `CreateCompatibleDC` imports in `shell32` and `ExplorerFrame`. +- Adds per-module paint telemetry plus image/paint overlap and clip-region diagnostics. +- Retains exact registered-window filtering and avoids process-wide API hooks. + +## 1.5.73.0 Diagnostic - 2026-07-03 + +- Replaced the non-windowed `dui70!GetDC(NULL)` diagnostic path with scoped `shell32!BeginPaint` and `shell32!EndPaint` import hooks. +- Mirrors the reference renderer's DirectUI paint-DC association while retaining exact registered-window filtering. + +## 1.5.72.0 Diagnostic - 2026-07-03 + +- Replaced the unrelated `ExplorerFrame!BeginPaint` import hook with scoped `dui70!GetDC` and `dui70!ReleaseDC` import hooks. +- Associates only exact registered `DirectUIHWND` DCs with the background renderer. +- Retains delayed telemetry to verify DC resolution and alpha blending in the target Windows 10 VM. + +## 1.5.71.0 Diagnostic - 2026-07-03 + +- Added read-only native telemetry for the isolated Explorer background renderer. +- Logs delayed snapshots for `BeginPaint`, compatible DC propagation, `FillRect`, and `AlphaBlend` without changing hook targets or rendering behavior. +- Keeps 1.5.70.0 Stable as the rollback baseline. + +## 1.5.70.0 Stable - 2026-07-03 + +- Adds a scoped `ExplorerFrame.dll` `BeginPaint` import patch to capture the real + DirectUI paint DC without installing a process-wide hook +- Maps the captured paint DC to the already registered `DirectUIHWND` +- Keeps `FillRect` and `CreateCompatibleDC` patches limited to `dui70.dll` +- Retains the stable background-only state separation from 1.5.69 + +## 1.5.69.0 Stable - 2026-07-03 + +- Separates isolated background-renderer state from the legacy QTHookLib state +- Skips the invalid ShellBrowser-hook call in background-only mode +- Removes the additional `dui70.dll` `DeleteDC` patch not used by the reference implementation +- Replaces DeleteDC tracking with bounded, overwrite-on-create compatible-DC mapping + +## 1.5.68.0 Stable - 2026-07-03 + +- Removed `std::random_device` from Explorer background renderer construction +- Uses a deterministic renderer seed so startup does not enter platform entropy code +- Added phase diagnostics for singleton creation, configuration, image enumeration, + WIC decode, DIB creation, pixel copy, and state commit +- Logs the exact native renderer phase after both success and guarded failure + +## 1.5.67.0 Stable - 2026-07-03 + +- Replaced the background renderer's GDI+ decoder with Windows Imaging Component +- Removed `GdiplusStartup`, raw `LockBits` access and manual source-stride traversal +- Decodes PNG/BMP/JPEG directly into validated premultiplied `32bppPBGRA` DIB surfaces +- Addresses the renderer-stage access violation observed on Windows 10 22H2 build 19045.5679 +- Retains phased renderer/hook diagnostics and guarded `dui70.dll` activation + +## 1.5.66.0 Stable - 2026-07-03 + +- Hardened `dui70.dll` PE/import parsing for later Windows 10 22H2 servicing builds +- Bounded every descriptor, thunk and import-name read to the loaded module image +- Guarded native IAT reads and writes against structured exceptions +- Split renderer initialization from IAT activation for precise managed diagnostics +- Added native export guards so unsupported layouts return an error instead of terminating Explorer + +## 1.5.65.0 Stable - 2026-07-03 + +- Moved Explorer background ownership into the already loaded `QTTabBarNative.dll` +- Stopped loading the legacy monolithic `QTHookLib` in background-only mode +- Removed the background feature's file dependency on `QTHookLib32/64.dll` +- Preserved the three module-scoped `dui70.dll` import hooks and safe image renderer +- Added an architecture smoke test proving initialization succeeds with no legacy hook DLL + +## 1.5.64.0 Stable - 2026-07-03 + +- Replaced the legacy Explorer background path with an encapsulated renderer +- Removed MinHook entirely from background-only initialization +- Limited interception to three `dui70.dll` import slots and registered `DirectUIHWND` views +- Added validated immutable image snapshots and safe live configuration reloads +- Added correct premultiplied PNG alpha rendering and HDC lifecycle tracking +- Added window-property tokens to prevent reused HWND values from matching stale state +- Added configurable image directories, random selection and path-specific images +- Added ESC startup recovery while keeping legacy Shell hooks disabled by default +- Preserved native HRESULT diagnostics across the managed bridge + ## 1.5.62.0 Stable - 2026-07-02 - Consolidated the native and .NET Framework 4.8 QTTabBar code lines @@ -16,4 +127,3 @@ - Added isolated Explorer background rendering from `config.ini` - Improved Win+E capture, tab focus and toolbar persistence - Removed release debug paths and reduced success-log noise - diff --git a/CREDITS.md b/CREDITS.md index 90e38c0..ff189c7 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -14,10 +14,10 @@ QTTabBar Native Enhanced combines and extends work from several generations of Q - **Akay Devel Coder** - project owner, product direction, integration decisions, visual design and extensive Windows/VM testing - **OpenAI Codex** - major integration, debugging, native/managed implementation and release-engineering assistance under the project owner's direction +- **Maplespe / ExplorerBgTool** - inspiration for configurable and path-specific Explorer background images; this project uses an independently reworked renderer integrated with QTTabBar's targeted window registration The attribution list is intentionally open for correction and expansion as additional upstream history is identified. ## Third-party components This repository contains or references third-party components including MinHook, WiX build definitions and NotifyPropertyWeaver. Their original license and attribution terms continue to apply. - diff --git a/Installer/Bundle.wxs b/Installer/Bundle.wxs index 41d306c..048ae13 100644 --- a/Installer/Bundle.wxs +++ b/Installer/Bundle.wxs @@ -3,8 +3,8 @@ xmlns:bal="http://schemas.microsoft.com/wix/BalExtension" xmlns:netfx="http://schemas.microsoft.com/wix/NetFxExtension"> - diff --git a/Installer/Installer.wxs b/Installer/Installer.wxs index 73adb25..729de66 100644 --- a/Installer/Installer.wxs +++ b/Installer/Installer.wxs @@ -23,14 +23,14 @@ - - + + - + - + + - + - + + - + + +DevBuild: 2022/8/15 19:01:42 (2.0.50727.9164) + + + +1.0 + + + +08/29/2022 + + Trennzeichen -Zurück -Vorwärts +Zurückgehen +Vorwärtsgehen Gruppen -Zuletzt geschlossen -Programmstarter +Kürzlich geschlossen +Anwendungen Neues Fenster -Dupliziere aktive Registerkarte +Dies klonen Sperren -Kopier-Werkzeug -Immer im Vordergrund -Tabulator schließen -Alle schließen, außer den aktuellen Tab +Kopierwerkzeug +Oberste +Schließen +Alles außer dem aktuellen schließen Fenster schließen -Linken Tab schließen -Rechten Tab schließen -Aufwärts -Aktualisieren +Links schließen +Rechts schließen +Eine Ebene höher +Neu laden Suchen Deckkraft -Suchbox +Suchfeld Optionen Pfad Name -Aktueller Ordnerp -Aktueller Ordnern -MD5-Prüfsumme - Artikel -Pfade aller Tabs +Aktueller Ordnerpfad +Aktueller Ordnername +MD5 + Elemente +Pfade aller geöffneten Registerkarten @@ -68,10 +76,10 @@ Standard OK Abbrechen -&Anwenden +&Übernehmen &Standard -&Seite Zurücksetzen -&Alle zurücksetzen +Zurücksetzen &Seite +&Alles Zurücksetzen Zurücksetzen Hinzufügen Hinzufügen... @@ -91,21 +99,20 @@ Verknüpfung erstellen in: -Operation failed.\r\nBitte stellen Sie sicher, dass die Datei oder das Ziel der Verknüpfung existiert:\r\n\r\n{0} +Operation fehlgeschlagen.\r\nBitte stellen Sie sicher, dass die Datei oder das Ziel der Verknüpfung existiert:\r\n\r\n{0} Fehler - QTTabBar -Warnung: QTTabBar konnte nicht automatisch aktiviert werden. Um sie manuell zu aktivieren, drücken Sie die Alt-Taste und wählen Sie dann QTTabBar aus dem Menü Ansicht/Symbolleisten. -Konnte nicht aktivieren +Warnung: Die QTTabBar konnte nicht automatisch aktiviert werden. Um sie manuell zu aktivieren, drücken Sie die Alt-Taste, lassen Sie sie los und wählen Sie QTTabBar aus dem Menü Ansicht/Symbolleisten. +Konnte nicht aktiviert werden Fehler -Die QTTabBar-Hook-Bibliothek kann nicht geladen werden. -Die QTTabBar-Hook-Bibliothek konnte nicht initialisiert werden. -Einige Funktionen sind möglicherweise nicht funktionsfähig. Um dies zu beheben, müssen Sie die Anwendung möglicherweise neu installieren. -Hooking des Desktops fehlgeschlagen. Bitte aktivieren Sie das Werkzeug QT Tab Desktop erneut. -Der Vorgang ist fehlgeschlagen.\r\nBitte stellen Sie sicher, dass der Ordner existiert oder Sie -Zugriffsberechtigung für den Ordner haben:\r\n\r\n\t{0} +QTTabBar-Hook-Bibliothek konnte nicht geladen werden. +QTTabBar-Hook-Bibliothek konnte nicht initialisiert werden. +Einige Funktionen sind möglicherweise nicht funktionsfähig. Um dies zu beheben, müssen Sie möglicherweise die Anwendung neu installieren. +Hooking des Desktops fehlgeschlagen. Bitte aktivieren Sie das QT Tab Desktop-Tool erneut. +Der Vorgang ist fehlgeschlagen.\r\nBitte stellen Sie sicher, dass der Ordner existiert oder dass Sie die Berechtigung haben, darauf zuzugreifen:\r\n\r\n\t{0} -Bild-Dateien +Bilddateien Sprachdateien Plugin-Dateien @@ -114,28 +121,28 @@ Plugin-Dateien Pfad Hash Schließen -Klar +Löschen Aktualisieren -Immer an der Spitze +Immer im Vordergrund Ergebnis anzeigen Löschen beim Schließen Vollständiger Pfad -(Jetzt wird gerechnet...) +(Jetzt berechnen...) Alle Links -Top +Oben Rechts Unten -Desktop-Suche +Desktop Suche Bilddatei ist ungültig.\r\n\r\nBitte geben Sie eine 432 x 40 px große Bilddatei an. Suchergebnisse in -Abkürzung +Verknüpfung Wählen Sie Ihre Datei Wählen Sie Ihren Ordner Experimentell @@ -143,196 +150,199 @@ Dummy -Ändern Sie das Verhalten von Explorer-Fenstern. -Einzelfenster-Modus +Ändern Sie das Verhalten von Explorer-Fenstern +Einzelfenstermodus Erfassen neuer Explorer-Fenster als neue Registerkarten Neue Explorer-Fenster nicht erfassen Standardspeicherort für neue Fenster und Registerkarten -Speichern der Sitzung +Sitzungsspeicherung Starten Sie jedes Mal eine neue Sitzung -Alle Registerkarten der vorherigen Sitzung wiederherstellen -Nur die gesperrten Registerkarten der vorherigen Sitzung wiederherstellen -Wenn die Schaltfläche "Schließen" angeklickt wird +Wiederherstellen aller Registerkarten aus der vorherigen Sitzung +Wiederherstellen nur der gesperrten Registerkarten aus der vorherigen Sitzung +Wenn die Schließen-Schaltfläche angeklickt wird Schließen Sie das Fenster -Schließen der aktuellen Registerkarte -Alle nicht gesperrten Registerkarten schließen -Senden Sie das Fenster in die Taskleiste auf +Schließen Sie die aktuelle Registerkarte +Schließen Sie alle nicht gesperrten Registerkarten +Senden Sie das Fenster in den Systemtray Schließen Minimieren -Blaue Plus-Taste +Plus-Schaltfläche -Ändern Sie die Optionen in Bezug auf die Registerkarten. +Ändern Sie die Optionen für die Registerkarten. Neue Registerkarten öffnen: -Wenn die aktuelle Registerkarte geschlossen ist, wechseln Sie in die: -Sofortiges Umschalten auf neue Registerkarten -Vorhandene Registerkarten wiederverwenden -Mehrdeutige Registerkarten umbenennen -Wenn Sie mit dem Mauszeiger über eine Registerkarte ziehen, -Wechseln Sie dazu -Anzeigen des Menüs Unterordner-Tipp -Registerkarten-Symbole -Ordnersymbole auf Registerkarten anzeigen -Das Menü "Unterordner-Tipp" anzeigen, wenn auf das Symbol geklickt wird -Den Laufwerksbuchstaben auf dem Symbol anzeigen -Schließen-Taste -Schließen-Schaltfläche auf Registerkarten anzeigen +Wenn die aktuelle Registerkarte geschlossen wird, wechseln Sie zu der Registerkarte: +Sofort zu neuen Tabs wechseln +Vorhandene Tabs wiederverwenden +Mehrdeutige Tabs umbenennen +Beim Ziehen über einen Tab, +zu diesem wechseln +Menü Unterordner-Inhalt anzeigen +Tab-Symbole +Ordnersymbole auf Tabs anzeigen +Menü Unterordner-Inhalt anzeigen, wenn auf das Symbol geklickt wird +Laufwerksbuchstabe auf dem Symbol anzeigen +Schließen-Schaltfläche +Schließen-Schaltfläche auf Tabs anzeigen Nur bei gedrückter Alt-Taste -Nur bei Mausverschiebung -Registerkarte Bar -Navigationsschaltflächen in der Registerkartenleiste anzeigen -Auf der linken Seite -Auf der rechten Seite +Nur bei Mausbewegung +Registerkartenleiste +Navigationsschaltflächen auf der Registerkartenleiste anzeigen +Links +Rechts Mehrere Reihen von Registerkarten zulassen -Legen Sie die Zeile mit der aktiven Registerkarte immer unten an +Die Reihe mit der aktiven Registerkarte immer unten anordnen Links von der aktuellen Registerkarte Rechts von der aktuellen Registerkarte -In der Position ganz links -In der Position ganz rechts -Reiter nach links -Reiter nach rechts -Registerkarte ganz links -Registerkarte ganz rechts +Ganz links +Ganz rechts +Registerkarte nach links +Registerkarte nach rechts +Ganz links +Ganz rechts Zuletzt aktivierte Registerkarte Verhalten -Aktivieren oder Deaktivieren von Anpassungen der Listenansicht des Explorers. +Aktivieren oder Deaktivieren von Tweaks für die Listenansicht des Explorers. Tweaks, die mit beiden Listenansichten verwendet werden können Anzeige von Spaltenüberschriften in allen Ansichtsmodi (Windows Vista/7) -Verwenden Sie die Standard-Dateisystemansicht für Bibliotheksordner (Windows 7) +Verwendung der Standard-Dateisystemansicht für Bibliotheksordner (Windows 7) Abwählen der Dateierweiterung beim Umbenennen von Dateien (Windows XP) -Zyklusauswahl mit F2 beim Umbenennen -Beim Verschieben der Auswahl mit den Pfeiltasten umbrechen +Auswahl mit F2 beim Umbenennen umschalten +Umdrehen beim Verschieben der Auswahl mit den Pfeiltasten Rücktaste geht eine Ebene nach oben (Windows Vista/7) Scrollen mit Mausrad bei gedrückter Umschalttaste scrollt horizontal Tweaks, die nur mit der älteren Listenansicht verwendet werden können -Aktivieren Sie das ältere Steuerelement für die Listenansicht (Windows 7) -Vollständige Zeilenauswahl in der Details-Ansicht -Gitterlinien in der Ansicht "Details" anzeigen -Abwechselnde Zeilenfarben in der Details-Ansicht +Aktivieren der älteren Listenansicht-Steuerung (Windows 7) +Vollständige Zeilenauswahl in der Detailansicht +Gitterlinien in der Detailansicht anzeigen +Alternative Zeilenfarben in der Detailansicht Vordergrundfarbe: Hintergrundfarbe: -Ändern Sie das Verhalten der Tooltips für Unterordner und Vorschau. -Tipps für Unterordner -Tipps für Unterordner einschalten +Ändern Sie das Verhalten von Unterordner- und Vorschau-Tooltips +Unterordner-Inhalte +Unterordner-Inhalte aktivieren Nur bei gedrückter Umschalttaste Dateien anzeigen -Vorschau-Tooltips beim Überfahren von Menüpunkten mit der Maus anzeigen +Vorschau-Tooltips anzeigen, wenn Sie mit der Maus über Menüpunkte fahren Vorschau-Tooltips -Vorschau-Tooltips einschalten +Vorschau-Tooltips aktivieren Nur bei gedrückter Umschalttaste Dateiinformationen unter Bildern anzeigen Maximale Breite x Höhe: Schriftart: -Text-Dateitypen +Textdateitypen Bild- und Videodateitypen -Allgemeine Optionen für das Verhalten von QTTabBar. -Integration der Taskleiste -Anzeigen von Registerkartenvorschauen in der Taskleiste -Geschichte -Verlauf geschlossener Registerkarten beibehalten +Allgemeine Einstellungen für das Verhalten von QTTabBar +Taskleisten-Integration +Registerkartenvorschau in der Taskleiste anzeigen +Verlauf +Verlauf geschlossener Registerkarten behalten Jetzt löschen -Historie der geöffneten Dateien aufbewahren +Verlauf geöffneter Dateien behalten Netzwerk -Netzwerk-Timeout (Geben Sie 0 für die Systemvorgabe ein): +Netzwerk-Timeout (geben Sie 0 für die Systemvorgabe ein): Regelmäßig nach Updates suchen Jetzt prüfen Exportieren Einstellungen exportieren... Dateiverlauf löschen? Registerkartenverlauf löschen? +Sound +Enable Sound +Activar o som -Ändern Sie das Aussehen von Registerkarten oder der Registerkartenleiste. -Registerkarte Bild -Benutzerdefiniertes Registerkartenbild verwenden: -Auslegungsspielräume: -Überlappungsbereich: -Inhalt Ränder: -Hit-Test transparente Bereiche -Registerkartengröße -Höhe: -Min. Breite: -Max. Breite: -Auslegungsmodus: +Ändern Sie das Aussehen der Registerkarten und der Registerkartenleiste +Tab Bild +Benutzerdefiniertes Bild: +Dimensionierung von Rändern: +Überlappungsbereich: +Inhaltsränder: +Hit-Test transparenter Bereich +Tab Größe +Höhe: +Minimale Breite: +Maximale Breite: +Skalierungsmodus: Volle Breite Gleiche Größe -Registerkarte Text -Textfarben: -Schattenfarben: +Tab Text +Text Farben: +Schatten Farben: Aktive Farbe Inaktive Farbe -Mouseover-Farbe -Text Schriftart: -Ausrichtung: +Hover-Farbe +Schriftart: +Ausrichtung: Links -Zentrum -Symbolleisten-Hintergrund -Bild -Einfarbig -Jeden Balken einzeln abbilden -Streckmodus: -Auslegungsspielräume: -Skin-Datei +Zentriert +Hintergrund der Symbolleiste +Benutzerdefiniertes Bild +Vollfarbe +Die Bilder werden von jedem Symbolleistenbereich ausgefüllt +Speicherort des Bildes: +Dimensionierung von Rändern: +Skin-Dateien Skin importieren... Skin exportieren... -Strecken +Dehnen Echte Größe -Fliese +Kacheln -Weisen Sie den verschiedenen Mausaktionen Befehle zu. -Um eine Mausbindung hinzuzufügen, führen Sie eine Mausaktion auf dem Plus-Symbol links neben dem entsprechenden Zieltyp aus. Um eine Bindung zu entfernen, wählen Sie sie in der Liste aus und drücken Sie die Entf-Taste. -Andere Mausoptionen -Mausrad scrollt das Fenster unter der Maus -Maus-Akkord +Weisen Sie verschiedenen Mausaktionen Befehle zu +Um eine Mausbindung hinzuzufügen, führen Sie eine Mausaktion auf dem Plus-Symbol links neben dem entsprechenden Zieltyp aus. Um eine Bindung zu entfernen, markieren Sie sie in der Liste und drücken Sie die Entf-Taste. +Weitere Mausoptionen +Mausrad rollt das Fenster unter der Maus +Mausakkord Aktion -Irgendwo -Registerkarte -Hintergrund der Registerkartenleiste -Ordner Link +Überall +Tabulator +Tab-Leisten-Hintergrund +Ordner-Link Datei oder Ordner -Explorer Hintergrund +Explorer-Hintergrund Linksklick Rechtsklick -Mittlerer Klick +Mittelklick Doppelklick -X1 Klick -X2 Klick +X1-Klick +X2-Klick Diese Maustaste kann für dieses Ziel nicht verwendet werden. Die gültigen Maustasten für dieses Ziel sind: Ungültige Taste -Tastaturkürzel ändern. -Wählen Sie eine Aktion aus der Liste aus und drücken Sie die Tastengeste, die Sie daran binden möchten. Drücken Sie Escape, um die Bindung aufzuheben. +Tastenkombinationen ändern +Wählen Sie eine Aktion aus der Liste aus und drücken Sie die Tastenkombination, die Sie damit verbinden möchten. Drücken Sie Escape, um die Bindung zu löschen. Andere Tastaturoptionen -Das Fenster "Tab Switcher" anzeigen, wenn Strg + Tab gedrückt wird +Tabulatorwechsel-Fenster anzeigen, wenn Strg + Tab gedrückt wird Aktion -Tastenanschlag -Diese Taste ist bereits zugewiesen: +Tastendruck +Diese Taste ist bereits zugewiesen an: Soll sie neu zugewiesen werden? Tastenkonflikt -Erstellen und verwalten Sie Registerkartengruppen. -Um einer Gruppe eine Schnelltaste zuzuweisen, wählen Sie sie aus und drücken Sie die entsprechende Tastengeste. Drücken Sie Escape, um die Bindung zu löschen. +Erstellen und Verwalten von Registerkartengruppen +Um einer Gruppe ein Tastenkürzel zuzuweisen, wählen Sie sie aus und drücken Sie die entsprechende Tastengeste. Drücken Sie Escape, um die Bindung zu löschen. Neue Gruppe erstellen Ordner -Inbetriebnahme +Start Tastenkürzel Neue Gruppe Gruppe "{0}" öffnen @@ -340,52 +350,52 @@ Gruppe "{0}" öffnen Erstellen Sie Verknüpfungen zu häufig verwendeten Dateien oder Anwendungen. -Um einer Anwendung eine Schnelltaste zuzuweisen, wählen Sie sie aus und drücken Sie die entsprechende Tastengeste. Drücken Sie Escape, um die Verknüpfung zu löschen. +Um einer Anwendung eine Verknüpfung zuzuweisen, wählen Sie sie aus und drücken Sie die entsprechende Tastenkombination. Drücken Sie Escape, um die Verknüpfung zu löschen. Neuen Ordner erstellen Pfad: Argumente: Arbeitsverzeichnis: Anwendung -Tastenkürzel -Die folgenden Schlüsselwörter werden zur Laufzeit durch Pfadzeichenketten in doppelten Anführungszeichen ersetzt. +Verknüpfungstaste +Die folgenden Schlüsselwörter werden zur Laufzeit durch Pfadangaben in doppelten Anführungszeichen ersetzt. Ausgewählte Dateien. -Ausgewählte Mappen. +Ausgewählte Ordner. Ausgewählte Dateien und Ordner. Aktueller Ordner. Aktueller Ordner, wenn keine Auswahl, sonst ausgewählter Ordner. -Neue Mappe +Neuer Ordner Diesen Ordner und seinen Inhalt entfernen? Anwendung "{0}" starten -Anpassen der Schaltflächenleiste. +Anpassen der Schaltflächenleiste Schaltflächen -Optionen der Schaltflächenleiste +Optionen für die Schaltflächenleiste Große Symbole Beschriftungen auf Schaltflächen anzeigen -Sperren der Reihenfolge von Dropdown-Schaltflächenmenüs -Sperren der Größe des Suchfelds -Benutzerdefinierte Schaltflächenbilder +Reihenfolge der Dropdown-Schaltflächenmenüs festlegen +Größe des Suchfelds festlegen +Benutzerdefinierte Schaltflächen-Icons -Verwalten Sie Plugins von Drittanbietern. -Ein Plugin installieren -(Disabled) +Plugins von Drittanbietern verwalten. +Plugin installieren +(Deaktiviert) von {0} {0} wurde entfernt. Dieses Plugin wird installiert, wenn Sie auf OK oder Übernehmen drücken. Dieses Plugin wird aktiviert, wenn Sie auf OK oder Übernehmen drücken. Dieses Plugin wird deaktiviert, wenn Sie auf OK oder Übernehmen drücken. -Wenn Sie dieses Plugin deinstallieren, werden auch die folgenden Plugins deinstalliert: +Die Deinstallation dieses Plugins deinstalliert auch die folgenden Plugins: Fortfahren? -Aktivieren Sie +Aktivieren Deaktivieren -Ändern Sie die Sprache. +Sprache ändern Hauptsprache Eingebaute Sprache verwenden: Sprachdatei verwenden: @@ -396,25 +406,40 @@ Original Übersetzt Alle Einträge auf ihren ursprünglichen Wert zurücksetzen? Fehler beim Speichern der Datei. -Vereinfachtes Chinesisch +简体中文 +English +German -Abspann und Versionsinformationen anzeigen. -Original-Code von {0} +Credits und Versionsinformationen anzeigen: +Originalcode von {0} Hauptentwickler: Andere Entwickler: -Icons und Grafiken: +Symbole und Grafiken: Wenn Sie QTTabBar nützlich finden, ziehen Sie bitte eine kleine Spende in Betracht. -Vereinfachtes Chinesisch: -Gebaut von: {0} +汉化修改: +Build by: {0} + +Schaltfläche für neuen Tab +Angepasste Grafik verwenden: + + + +Tab-Schaltflächengrafiken +Benutzerdefinierte Grafik für „Tab schließen“: +Versatz der Schließen-Grafik (X, Y): +Benutzerdefinierte Grafik für „Tab gesperrt“: +Versatz der Sperrgrafik (X, Y): + + -QTTabBar Optionen -Alle Optionen auf dieser Seite auf ihre Standardwerte zurücksetzen? -Alle Optionen auf ihre Standardwerte zurücksetzen? Dies hat keine Auswirkungen auf Gruppen, Anwendungen oder Plugins. -Konfirmation +QTTabBar Einstellungen +Alle Einstellungen auf dieser Seite auf ihre Standardwerte zurücksetzen? +Alle Einstellungen auf ihre Standardwerte zurücksetzen? Dies wirkt sich nicht auf Gruppen, Anwendungen oder Plugins aus. +Bestätigung @@ -422,86 +447,87 @@ https://github.com/indiff/qttabbar/blob/master/QTTabBar/Resources/wechat_pay.jpg -Zurückgehen -Vorwärts gehen -Zurück zum Start -Vorwärts bis Ende -Nächste Registerkarte wählen +Zurück +Vorwärts +Zurück zum Anfang +Vorwärts zum Ende +Nächste Registerkarte auswählen Vorherige Registerkarte auswählen Erste Registerkarte auswählen Letzte Registerkarte auswählen -Wechsel zur zuletzt aktivierten Registerkarte +Zur zuletzt aktivierten Registerkarte wechseln Neue Registerkarte öffnen Neues Fenster öffnen Registerkarten aus anderen Fenstern zusammenführen Aktuelle Registerkarte schließen -Alle schließen, außer aktive +Alle außer der aktuellen schließen Links schließen Rechts schließen Fenster schließen Schließen rückgängig machen Aktuelle Registerkarte klonen Aktuellen Ordner in neuem Fenster öffnen -Strom sperren / entsperren -Alle sperren / entsperren +Aktuelle sperren / entsperren + Alle sperren / entsperren Ordner durchsuchen Neue Gruppe erstellen Optionsdialog öffnen Menü der Symbolleiste anzeigen -Aktuelles Registerkartenmenü anzeigen -Gruppenmenü anzeigen (Schaltflächenleiste) -Menü "Letzte Ordner" anzeigen (Schaltflächenleiste) -Menü der Benutzeranwendung anzeigen (Schaltflächenleiste) -Menü "Letzte Dateien" anzeigen (Schaltflächenleiste) +Menü der aktuellen Registerkarte anzeigen +Menü der Gruppe anzeigen (Buttonleiste) +Menü des letzten Ordners anzeigen (Buttonleiste) +Menü der Benutzeranwendung anzeigen (Buttonleiste) +Menü der letzten Dateien anzeigen (Buttonleiste) Neue leere Datei erstellen Neuen Ordner erstellen Pfad der ausgewählten Dateien kopieren Name der ausgewählten Dateien kopieren -Aktuellen Ordnerpfad kopieren -Aktuellen Ordnernamen kopieren +Pfad des aktuellen Ordners kopieren + Aktuellen Ordnernamen kopieren MD5 der ausgewählten Dateien prüfen Fenster ganz nach oben bringen Transparenz + Transparenz - -Fokus-Dateiliste -Fokus-Suchleiste (Explorer) -Fokus-Suchfeld (Schaltflächenleiste) -Unterordner-Tippmenü für ausgewählten Ordner anzeigen +Dateiliste fokussieren +Suchleiste (Explorer) fokussieren +Suchfeld (Buttonleiste) fokussieren +Unterordner-Inhalt-Menü für ausgewählten Ordner anzeigen Fenster an Taskleiste senden -Fokussieren der Registerkartenleiste -Registerkarten nach Namen sortieren -Registerkarten nach Pfad sortieren -Registerkarten nach letzter Aktivierung sortieren +Tab-Leiste fokussieren +Tabs nach Namen sortieren +Tabs nach Pfad sortieren +Tabs nach letzter Aktivierung sortieren Nichts Eine Ebene höher Aktualisieren Einfügen -Maximieren Sie -Minimieren +Maximieren + Minimieren In neuer Registerkarte öffnen -In neuer Registerkarte öffnen, ohne zu aktivieren +In neuer Registerkarte ohne Aktivierung öffnen In neuem Fenster öffnen -Schneiden +Ausschneiden Kopieren Löschen Eigenschaften Pfad kopieren Name kopieren Prüfsumme anzeigen -Register schließen -Registerkarten nach links schließen -Registerkarten nach rechts schließen +Registerkarte schließen + Registerkarte links schließen +Registerkarte rechts schließen Eine Ebene höher -Schloss +Sperren Kontextmenü anzeigen In neuem Fenster öffnen Klonen Pfad kopieren Eigenschaften -Menü "Unterverzeichnis anzeigen" Tipp -Alle schließen, außer diesem +Inhalt-Menü für Unterverzeichnisse anzeigen +Alles außer diesem schließen CMD öffnen -Ausgewählte Ordner in neuer Registerkarte öffnen, ohne sie zu aktivieren +Ausgewählte Ordner in neuer Registerkarte ohne Aktivierung öffnen +Add to group @@ -517,48 +543,48 @@ https://github.com/indiff/qttabbar Schließen Rechts schließen Links schließen -Alle schließen, außer diesem -Zur Gruppe hinzufügen +Alles außer diesem schließen +Zu Gruppe hinzufügen Neue Gruppe erstellen -Schloss -Klonen Sie dies +Sperren +Dies klonen Neues Fenster Pfad kopieren Eigenschaften -Registerkarte Historie +Tab-Historie Gruppen -Rückgängig geschlossen +Geschlossen rückgängig machen Zuletzt aktiviert -Zuletzt geöffnete Dateien +Kürzlich geöffnete Dateien Ordner durchsuchen -Alle schließen, außer Strom +Alles außer dem aktuellen schließen Fenster schließen Optionen -freischalten +Entsperren Zum Anwendungsmenü hinzufügen : -Artikel +Einträge Abbrechen -Zweige -Diesen Punkt aus dem Menü entfernen -&Öffne enthaltender Ordner -Registerkarte "Etikett -Tabulator-Reihenfolge +Entwicklungszweig +Diesen Eintrag aus dem Menü entfernen +O&pen, der den Ordner enthält +Tab-Label +Tab-Reihenfolge Name Pfad Aktiv -Sperren der Symbolleisten -Registerkarten anderer Fenster zusammenführen +Symbolleisten sperren +Tabs anderer Fenster zusammenführen Invertieren CMD öffnen -Es trat ein Fehler auf bei den Versuch \r\n\r\n "{0}" zu öffnen. +QTTabBar konnte nicht geöffnet werden\r\n\r\n "{0}". Neue Gruppe erstellen -Name der Gruppe: +Gruppenname: Alle Registerkarten hinzufügen @@ -568,7 +594,7 @@ Registerkarten Tweaks Tooltips Allgemein -Erscheinungsbild +Aussehen Maus Tasten Gruppen @@ -590,7 +616,7 @@ Tastenkombinationen für Anwendungen aktivieren Gruppen -Rückgängig geschlossen +Geschlossen rückgängig machen Anwendungen Zuletzt geöffnete Dateien @@ -598,11 +624,13 @@ Zuletzt geöffnete Dateien 1 Fenster {0} Fenster +Restore all +Close All -Es wurde eine neue Version von QTTabBar veröffentlicht: -Drücken Sie OK, um die Website aufzurufen. +Eine neue Version von QTTabBar wurde veröffentlicht: +Drücken Sie OK, um zur Website zu gelangen. Ihre Version von QTTabBar ist auf dem neuesten Stand. Neue Entwicklungsversion gefunden: Versionsdatei nicht gefunden (404). diff --git a/Installer/Bundle.wxs b/Installer/Bundle.wxs index 07b14fd..fcf2631 100644 --- a/Installer/Bundle.wxs +++ b/Installer/Bundle.wxs @@ -3,8 +3,8 @@ xmlns:bal="http://schemas.microsoft.com/wix/BalExtension" xmlns:netfx="http://schemas.microsoft.com/wix/NetFxExtension"> - diff --git a/Installer/Installer.wxs b/Installer/Installer.wxs index 3571901..3f83550 100644 --- a/Installer/Installer.wxs +++ b/Installer/Installer.wxs @@ -23,14 +23,14 @@ - - + + - + - + - + - PREVIOUSVERSIONSINSTALLED + UPGRADEFOUND diff --git a/QTTabBar/AbstractListView.cs b/QTTabBar/AbstractListView.cs index d877c04..8cded26 100644 --- a/QTTabBar/AbstractListView.cs +++ b/QTTabBar/AbstractListView.cs @@ -41,7 +41,8 @@ public virtual int GetHotItem() { return -1; } - public virtual void HandleF2() { + public virtual bool HandleF2() { + return false; } public virtual void HandleShiftKey() { diff --git a/QTTabBar/BreadcrumbBar.cs b/QTTabBar/BreadcrumbBar.cs index fd1bc08..3f396c7 100644 --- a/QTTabBar/BreadcrumbBar.cs +++ b/QTTabBar/BreadcrumbBar.cs @@ -38,6 +38,10 @@ class BreadcrumbBar { private NativeWindowController ParentController; private IntPtr hdpa = IntPtr.Zero; + public IntPtr Handle { + get { return BreadcrumbController.Handle; } + } + public BreadcrumbBar(IntPtr hwnd) { BreadcrumbController = new NativeWindowController(hwnd); BreadcrumbController.MessageCaptured += BreadcrumbController_MessageCaptured; @@ -79,7 +83,7 @@ private bool ParentController_MessageCaptured(ref Message msg) { return true; } else if(msg.Msg == WM.COMMAND) { - if(hdpa != IntPtr.Zero && ItemClicked != null && Control.ModifierKeys != Keys.None) { + if(hdpa != IntPtr.Zero && ItemClicked != null) { int itemId = PInvoke.LoWord(msg.WParam.ToInt32()); int idx = CommandToIndex(itemId); if(idx >= 0 && idx < ButtonCount()) { @@ -95,16 +99,56 @@ private bool ParentController_MessageCaptured(ref Message msg) { // Catch middle clicks private bool BreadcrumbController_MessageCaptured(ref Message msg) { if(msg.Msg == WM.MBUTTONUP) { - if(hdpa != IntPtr.Zero && ItemClicked != null) { - int idx = HitTest(QTUtility2.PointFromLPARAM(msg.LParam)); - if(idx >= 0 && idx <= ButtonCount()) { - DoItemClick(IndexToCommand(idx), Control.ModifierKeys, true); - } + Point pt = QTUtility2.PointFromLPARAM(msg.LParam); + if(TryHandleMiddleClick(pt, Control.ModifierKeys, false)) { + return true; } } return false; } + public bool TryHandleMiddleClick(Point point, Keys modKeys, bool screenCoordinates) { + if(hdpa == IntPtr.Zero || ItemClicked == null) { + return false; + } + int idx; + int count; + int ancestorIndex; + if(!TryGetHitAncestorIndex(point, screenCoordinates, out ancestorIndex, out idx, out count)) { + return false; + } + return DoItemClick(IndexToCommand(idx), modKeys, true); + } + + public bool TryGetHitAncestorIndex(Point point, bool screenCoordinates, out int ancestorIndex) { + int idx; + int count; + return TryGetHitAncestorIndex(point, screenCoordinates, out ancestorIndex, out idx, out count); + } + + public bool TryGetHitAncestorIndex(Point point, bool screenCoordinates, out int ancestorIndex, out int idx, out int count) { + return TryGetHitAncestorIndex(BreadcrumbController.Handle, point, screenCoordinates, out ancestorIndex, out idx, out count); + } + + public static bool TryGetHitAncestorIndex(IntPtr hwnd, Point point, bool screenCoordinates, out int ancestorIndex, out int idx, out int count) { + ancestorIndex = -1; + idx = -1; + count = 0; + if(hwnd == IntPtr.Zero || !PInvoke.IsWindow(hwnd)) { + return false; + } + if(screenCoordinates && !PInvoke.ScreenToClient(hwnd, ref point)) { + return false; + } + count = (int)PInvoke.SendMessage(hwnd, TB_BUTTONCOUNT, IntPtr.Zero, IntPtr.Zero); + idx = (int)PInvoke.SendMessage(hwnd, TB_HITTEST, IntPtr.Zero, ref point); + if(idx < 0 || idx >= count) { + return false; + } + ancestorIndex = count - 1 - idx; + return ancestorIndex >= 0; + } + private bool DoItemClick(int itemId, Keys modKeys, bool middle) { IntPtr lParam = GetButtonLParam(itemId); IntPtr ptr = PInvoke.DPA_GetPtr(hdpa, (int)lParam); // This pointer is NOT AddRef'd. Do not Release it!! diff --git a/QTTabBar/Config.cs b/QTTabBar/Config.cs index 72848a5..070b79f 100644 --- a/QTTabBar/Config.cs +++ b/QTTabBar/Config.cs @@ -85,6 +85,19 @@ public enum StretchMode { Tile, } + public enum TabDropDefaultEffect { + SystemDefault, + Copy, + Move, + Link, + } + + public enum TabDropHoverAction { + None, + SelectTab, + ShowSubfolderMenu, + } + /* * @����: ����Ŀ�� */ @@ -94,7 +107,8 @@ public enum MouseTarget { TabBarBackground, FolderLink, ExplorerItem, - ExplorerBackground + ExplorerBackground, + Breadcrumbs } /* @@ -234,6 +248,7 @@ public class Config { public static _Tips Tips { get { return ConfigManager.LoadedConfig.tips; } } /*Ԥ����ʾ*/ public static _Misc Misc { get { return ConfigManager.LoadedConfig.misc; } } /*����ѡ��*/ public static _Skin Skin { get { return ConfigManager.LoadedConfig.skin; } } /*��ǩ���*/ + public static _DragDrop DragDrop { get { return ConfigManager.LoadedConfig.dragdrop; } } public static _BBar BBar { get { return ConfigManager.LoadedConfig.bbar; } } /*��ťѡ��*/ public static _Mouse Mouse { get { return ConfigManager.LoadedConfig.mouse; } } /*������*/ public static _Keys Keys { get { return ConfigManager.LoadedConfig.keys; } } /*��ݲ���*/ @@ -247,6 +262,7 @@ public class Config { public _Tips tips { get; set; } public _Misc misc { get; set; } public _Skin skin { get; set; } + public _DragDrop dragdrop { get; set; } public _BBar bbar { get; set; } public _Mouse mouse { get; set; } public _Keys keys { get; set; } @@ -261,6 +277,7 @@ public Config() { tips = new _Tips(); misc = new _Misc(); skin = new _Skin(); + dragdrop = new _DragDrop(); bbar = new _BBar(); mouse = new _Mouse(); keys = new _Keys(); @@ -382,6 +399,23 @@ public _Tabs() { } } + [Serializable] + public class _DragDrop { + public bool TabDropTargetEnabled { get; set; } + public TabDropDefaultEffect TabDropDefaultEffect { get; set; } + public TabDropHoverAction TabDropHoverAction { get; set; } + public int TabDropHoverTime { get; set; } + public bool TabDropAcceptSameTabBar { get; set; } + + public _DragDrop() { + TabDropTargetEnabled = true; + TabDropDefaultEffect = TabDropDefaultEffect.SystemDefault; + TabDropHoverAction = TabDropHoverAction.ShowSubfolderMenu; + TabDropHoverTime = 700; + TabDropAcceptSameTabBar = true; + } + } + [Serializable] public class _Tweaks { public bool AlwaysShowHeaders { get; set; } @@ -813,6 +847,7 @@ public class _Mouse { public Dictionary TabActions { get; set; } public Dictionary BarActions { get; set; } public Dictionary LinkActions { get; set; } + public Dictionary BreadcrumbActions { get; set; } public Dictionary ItemActions { get; set; } public Dictionary MarginActions { get; set; } @@ -872,6 +907,9 @@ public _Mouse() { {MouseChord.Middle, BindAction.ItemOpenInNewTab}, {MouseChord.Ctrl | MouseChord.Middle, BindAction.ItemOpenInNewWindow} }; + BreadcrumbActions = new Dictionary { + {MouseChord.Middle, BindAction.ItemOpenInNewTab} + }; // ��Դ��������Ŀ�հ״� ItemActions = new Dictionary { {MouseChord.Middle, BindAction.ItemOpenInNewTab}, @@ -1238,6 +1276,7 @@ from settingProperty in categoryType.GetProperties() Config.Skin.CloseButtonImageOffsetY = QTUtility.ValidateMinMax(Config.Skin.CloseButtonImageOffsetY, -50, 50); Config.Skin.LockIconImageOffsetX = QTUtility.ValidateMinMax(Config.Skin.LockIconImageOffsetX, -50, 50); Config.Skin.LockIconImageOffsetY = QTUtility.ValidateMinMax(Config.Skin.LockIconImageOffsetY, -50, 50); + Config.DragDrop.TabDropHoverTime = QTUtility.ValidateMinMax(Config.DragDrop.TabDropHoverTime, 100, 5000); using(IDLWrapper wrapper = new IDLWrapper(Config.Skin.RebarImageFile)) { if(!wrapper.Available) Config.Skin.RebarImageFile = ""; } diff --git a/QTTabBar/ExtendedListViewCommon.cs b/QTTabBar/ExtendedListViewCommon.cs index 3f8a296..9aabbe0 100644 --- a/QTTabBar/ExtendedListViewCommon.cs +++ b/QTTabBar/ExtendedListViewCommon.cs @@ -390,21 +390,35 @@ public override int GetHotItem() { protected abstract bool HandleCursorLoop(Keys key); - public override void HandleF2() { + public override bool HandleF2() { IntPtr hWnd = GetEditControl(); - if(hWnd == IntPtr.Zero) return; + if(hWnd == IntPtr.Zero) return false; string str; using(SafePtr lParam = new SafePtr(520)) { - if(0 >= ((int)PInvoke.SendMessage(hWnd, 13, (IntPtr)260, lParam))) return; + if(0 >= ((int)PInvoke.SendMessage(hWnd, 13, (IntPtr)260, lParam))) return false; str = Marshal.PtrToStringUni(lParam); } - if(str.Length <= 2) return; + if(str.Length <= 2) return false; int num = str.LastIndexOf("."); - if(num != -1) { - IntPtr ptr3 = PInvoke.SendMessage(hWnd, 0xb0, IntPtr.Zero, IntPtr.Zero); - int start = QTUtility2.GET_X_LPARAM(ptr3); - int length = QTUtility2.GET_Y_LPARAM(ptr3); - if((length - start) >= 0) { + IntPtr ptr3 = PInvoke.SendMessage(hWnd, 0xb0, IntPtr.Zero, IntPtr.Zero); + int start = QTUtility2.GET_X_LPARAM(ptr3); + int length = QTUtility2.GET_Y_LPARAM(ptr3); + if((length - start) >= 0) { + if(num == -1) { + if((start == 0) && (length == str.Length)) { + start = length = str.Length; + } + else if((start == str.Length) && (length == str.Length)) { + start = length = 0; + } + else { + start = 0; + length = -1; + } + PInvoke.SendMessage(hWnd, 0xb1, (IntPtr)start, (IntPtr)length); + return true; + } + else { if((start == 0) && (length == num)) { start = length = num; } @@ -425,8 +439,10 @@ public override void HandleF2() { length = num; } PInvoke.SendMessage(hWnd, 0xb1, (IntPtr)start, (IntPtr)length); + return true; } } + return false; } public override void HandleShiftKey() { diff --git a/QTTabBar/HookLibManager.cs b/QTTabBar/HookLibManager.cs index 7bfb286..aa6b032 100644 --- a/QTTabBar/HookLibManager.cs +++ b/QTTabBar/HookLibManager.cs @@ -414,7 +414,7 @@ internal static void UpdateBackgroundWindow(IntPtr window, string path) if(!fHookLibraryLoaded || window == IntPtr.Zero) return; try { int result = QTTabBarNative_UpdateBackgroundWindow(window, path ?? String.Empty); - if(result != 0) { + if(result != 0 && result != unchecked((int)0x80004001)) { QTUtility2.log("UpdateBackgroundWindow failed: 0x" + result.ToString("X8")); } } diff --git a/QTTabBar/OptionsDialog/Options02_Tabs.xaml b/QTTabBar/OptionsDialog/Options02_Tabs.xaml index 794ddbf..5bb5b0a 100644 --- a/QTTabBar/OptionsDialog/Options02_Tabs.xaml +++ b/QTTabBar/OptionsDialog/Options02_Tabs.xaml @@ -123,7 +123,7 @@ Content="{qt:Resx Key=Options_Page02_Tabs, Index=5}" IsChecked="{Binding Path=RenameAmbTabs}" Style="{StaticResource CheckStyle}"/> - + - \ No newline at end of file + diff --git a/QTTabBar/OptionsDialog/Options04_Tooltips.xaml.cs b/QTTabBar/OptionsDialog/Options04_Tooltips.xaml.cs index c47daf9..36a5da0 100644 --- a/QTTabBar/OptionsDialog/Options04_Tooltips.xaml.cs +++ b/QTTabBar/OptionsDialog/Options04_Tooltips.xaml.cs @@ -147,6 +147,10 @@ private void btnResetMediaFileTypes_Click(object sender, RoutedEventArgs e) { lstMediaFileTypes.ScrollIntoView(MediaFileTypes.First()); } + private void btnClearPreviewCache_Click(object sender, RoutedEventArgs e) { + ThumbnailTooltipForm.ClearAllCaches(); + } + private void lstTextFileTypes_OnKeyDown(object sender, KeyEventArgs e) { if(e.Key == Key.Delete) RemoveSelectedFileType(lstTextFileTypes); } diff --git a/QTTabBar/Properties/AssemblyInfo.cs b/QTTabBar/Properties/AssemblyInfo.cs index bec93df..33c37e0 100644 --- a/QTTabBar/Properties/AssemblyInfo.cs +++ b/QTTabBar/Properties/AssemblyInfo.cs @@ -54,8 +54,8 @@ // You can specify all the values or you can default the Revision and Build Numbers // by using the '*' as shown below: -[assembly: AssemblyVersion("1.6.0.1")] -[assembly: AssemblyFileVersion("1.6.0.1")] // edit this +[assembly: AssemblyVersion("1.6.1.0")] +[assembly: AssemblyFileVersion("1.6.1.0")] // edit this // // In order to sign your assembly you must specify a key to use. Refer to the // Microsoft .NET Framework documentation for more information on assembly signing. diff --git a/QTTabBar/Resource_String_zh_CN.resx b/QTTabBar/Resource_String_zh_CN.resx index 0f0703e..d4c2a9b 100644 --- a/QTTabBar/Resource_String_zh_CN.resx +++ b/QTTabBar/Resource_String_zh_CN.resx @@ -1,4 +1,4 @@ - +