(gelöst)[WinAPI] Befinde ich mich in einer Suche?

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Benutzeravatar
Krishty
Establishment
Beiträge: 8238
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

(gelöst)[WinAPI] Befinde ich mich in einer Suche?

Beitrag von Krishty »

Schlecht formulierter Titel, aber:

Sagen wir, ich durchsuche Windows-Verzeichnisse nach Dateien. Die Suche spuckt mir, sagen wir, alle JPGs aus. Ich klicke doppelt auf ein JPG; die Windows Fotogalerie öffnet sich. Ich klicke weiter zum nächsten Bild … und jetzt passiert das Magische:

Die Fotogalerie zeigt NICHT die nächste Datei aus dem Verzeichnis an, in dem sich das JPG befindet – sie zeigt das nächste JPG aus der Suche an.

Wie klappt das?

Was ich schon weiß:
  • Windows legt für Dateisuchen ein virtuelles Verzeichnis an, das mit den Suchergebnissen verbunden wird.
  • Durch dieses Verzeichnis kann man iterieren wie durch jedes andere auch.
Allerdings bekommt mein Programm, wenn es für ein Suchergebnis gestartet wird, NICHT den Link zu dieser Suche, sondern den tatsächlichen Dateipfad. Woher weiß ich nun, dass ich mich in einer Suche befinde, und in welcher?
Zuletzt geändert von Krishty am 08.06.2016, 04:20, insgesamt 1-mal geändert.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4256
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

Re: [WinAPI] Befinde ich mich in einer Suche?

Beitrag von Chromanoid »

Sehr interessante Frage. Riecht für mich danach, dass man noch irgendwo was wie ne Shell-Extension registrieren muss oder irgendeine COM-Schnittstelle exponieren muss oder so.
Schon mal hier durch geschaut? https://msdn.microsoft.com/en-us/librar ... s.85).aspx

Das hier sieht auch ganz interessant aus, wäre aber echt ugly, wenn Microsoft das so macht: http://stackoverflow.com/questions/1419 ... m-within-c

edit: Also ich glaube der schaut sich wirklich irgendwie an was im Explorer passiert. Je nachdem wie schnell man den Explorer schließt und wie lange die Suche dauert und wie viele Ergebnisse kommen, funktioniert das mit der "Diashow" oder nicht.
Benutzeravatar
Krishty
Establishment
Beiträge: 8238
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [WinAPI] Befinde ich mich in einer Suche?

Beitrag von Krishty »

Chromanoid hat geschrieben:edit: Also ich glaube der schaut sich wirklich irgendwie an was im Explorer passiert. Je nachdem wie schnell man den Explorer schließt und wie lange die Suche dauert und wie viele Ergebnisse kommen, funktioniert das mit der "Diashow" oder nicht.
Oh scheiße, dann könnte das übel werden :(

Die andere Spur, die ich verfolge, ist STARTUPINFO. In dem Block legt Windows beim Start eines Prozesses alle erforderlichen erforderliche Informationen ab (weil NT bereits an den Aufrufer zurückkehrt, *bevor* der erste Thread des neuen Prozesses die Arbeit aufnimmt) und man kann dadurch so Dinge erfahren wie, ob man von der Task-Leiste oder durch eine Verknüpfung gestartet wurde.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Krishty
Establishment
Beiträge: 8238
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [WinAPI] Befinde ich mich in einer Suche?

Beitrag von Krishty »

Okay; ich wollte via Process Monitor herausfinden, wie die Fotogallerie das macht … aber zwischen 8.000 Registry- und Dateizugriffen habe ich nichts Nützliches entdeckt.

Ich kann herausfinden, welcher Prozess meinen Prozess startet. Unter Visual Studio ist das logischerweise der Visual Studio Debugger; beim Klick auf eine Suche ist es der Explorer-Prozess, der gerade am Suchen ist.

Mit dem Explorer-Prozess kann ich dann z.B. gucken, was gerade gesucht wird. Raymond Chen hat Beispiele: Querying information from an Explorer window
Das nutzt zwar jedes Mal Fenster-Handles, aber mit einem Prozess-Handle sollte ich genau so weit kommen; wäre ja gelacht.

Nachtrag: Scheiße an’er Latte: Ja, ich komme an alle offenen Explorer-Fenster. Ja, ich kann abfragen, was sie gerade suchen (IWebBrowser2::LocationURL) und welche Objekte gerade angezeigt werden. Aber dummerweise hat die Schnittstelle keine Funktion, an die PID zu kommen – und der Explorer-Prozess öffnet fast alle Fenster im selben Prozess (falls man das nicht gerade in der Systemsteuerung umgestellt hat). Hmmm.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4256
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

Re: [WinAPI] Befinde ich mich in einer Suche?

Beitrag von Chromanoid »

Kannst Du nicht direkt beim Start der Anwendung das Fenster im Vordergrund abfragen? So wurde das bei Stackoverflow vorgeschlagen, solange Dein Fenster noch nicht den Fokus hat, müsste das doch das richtige Fenster sein?! Es kommt mir auch so vor, dass die das bei der Fotogallerie genauso machen, so fragil wie die Funktion zu arbeiten scheint.
Benutzeravatar
Krishty
Establishment
Beiträge: 8238
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [WinAPI] Befinde ich mich in einer Suche?

Beitrag von Krishty »

Du hast recht; so lange brauche ich auch wieder nicht zum Starten, dass sich das Fenster schnell ändern würde.

Jetzt schaue ich mir den nächsten Schritt an – die Suchinformationen abfragen. Eine Möglichkeit wäre, das Suchprotokoll search-ms: abzufragen. Das macht Probleme, den aktuellen Item in der Suche wiederzufinden.

Die Fotogallerie scheint das nicht zu tun, und stattdessen den zweiten Weg zu gehen: Alle Items im Explorer-Fenster abfragen und darüber iterieren. Jedenfalls habe ich im Hinterkopf, dass die Gallerie einen Schnappschuss der Suche im Augenblick des Doppelklicks festhält und später gefundene Dateien beim Iterieren nicht mehr auftauchen.

Am Rande: Ich sitze da jetzt einige Stunden dran und das Wochenende ist vorbei. Ich glaube, ich gebe an der Stelle einfach auf – da keine Millionen User mein Programm täglich nutzen werden, rechtfertigt der Nutzen keineswegs den Aufwand.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Krishty
Establishment
Beiträge: 8238
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [WinAPI] Befinde ich mich in einer Suche?

Beitrag von Krishty »

Mir ist gerade aufgefallen, dass ich um das Problem doch nicht so einfach herumkomme.

Will ich in meinem Viewer die Pfeiltasten so nutzen wie in der Windows-Fotogalerie, muss ich an das Explorer-Fenster ran, sogar wenn wir Suchen ganz außen vor lassen. Beispiel: Falls die Dateien nach Größe sortiert sind statt nach Name, möchte man sie auch in dieser Reihenfolge im Programm sehen.

Aber erstmal gucken, ob man nicht auch über die Shell (Folder-Handler; nicht Explorer-Fenster-Handler) an diese Information kommt.

Nachtrag: IFolderView sieht unheimlich nützlich aus. Im Speziellen hat es eine Methode Items(), bei der man SVGIO_FLAG_VIEWORDER angeben kann um einen Enumerator zu bekommen, der den Ordnerinhalt in der Reihenfolge durchläuft, wie der Explorer sie anzeigt. Jetzt muss ich nur rauskriegen, ob ich so ein IFolderView auch kriegen kann, ohne dass ein Explorer-Fenster geöffnet ist.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Krishty
Establishment
Beiträge: 8238
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [WinAPI] Befinde ich mich in einer Suche?

Beitrag von Krishty »

Okay; ich habe mir schnell via Copy & Paste aus Raymond Chens Artikeln folgenden Code zusammengepflückt:

Code: Alles auswählen

void processExplorerWindow(HWND hwnd) {
 HWND hwndFind = GetForegroundWindow();

 IShellWindows *psw;
 if (SUCCEEDED(CoCreateInstance(CLSID_ShellWindows, NULL, CLSCTX_ALL,
                                IID_IShellWindows, (void**)&psw))) {
  VARIANT v;
  V_VT(&v) = VT_I4;
  IDispatch  *pdisp;
  BOOL fFound = FALSE;
  for (V_I4(&v) = 0; !fFound && psw->Item(v, &pdisp) == S_OK;
       V_I4(&v)++) {
   IWebBrowserApp *pwba;
   if (SUCCEEDED(pdisp->QueryInterface(IID_IWebBrowserApp, (void**)&pwba))) {
     HWND hwndWBA;
     if (SUCCEEDED(pwba->get_HWND((LONG_PTR*)&hwndWBA)) &&
       hwndWBA == hwndFind) {
       fFound = TRUE;
       IServiceProvider *psp;
       if (SUCCEEDED(pwba->QueryInterface(IID_IServiceProvider, (void**)&psp))) {
         IShellBrowser *psb;
         if (SUCCEEDED(psp->QueryService(SID_STopLevelBrowser,
                              IID_IShellBrowser, (void**)&psb))) {
           IShellView *psv;
           if (SUCCEEDED(psb->QueryActiveShellView(&psv))) {
             IFolderView *pfv;
             if (SUCCEEDED(psv->QueryInterface(IID_IFolderView,
                                               (void**)&pfv))) {

							 IEnumIDList * spEnum;

							 CComPtr<IShellFolder> spFolder;
							 pfv->GetFolder(IID_PPV_ARGS(&spFolder));
							 if(SUCCEEDED(pfv->Items(SVGIO_FLAG_VIEWORDER + SVGIO_ALLVIEW, IID_IEnumIDList, (void**)&spEnum))) {

								 for (CComHeapPtr<ITEMID_CHILD> spidl;
									 spEnum->Next(1, &spidl, nullptr) == S_OK;
									 spidl.Free()) {

									 STRRET str;
									 spFolder->GetDisplayNameOf(spidl, SHGDN_NORMAL, &str);
									 CComHeapPtr<wchar_t> spszName;
									 StrRetToStr(&str, spidl, &spszName);

									 wprintf(L"%s\n", spszName.operator LPWSTR());
								 }

								 spEnum->Release();
							 }

							 pfv->Release();
						 }
						 psv->Release();
					 }
					 psb->Release();
				 }
				 psp->Release();
			 }
		 }
		 pwba->Release();
	 }
	 pdisp->Release();
	}
	psw->Release();
 }
 printf("\n");
 printf("\n");
 printf("\n");
 printf("\n");
}


CoInitializeEx(0, COINIT_APARTMENTTHREADED );
for(;;) {
	processExplorerWindow(GetForegroundWindow());
	Sleep(1000);
}
… und tatsächlich: Listet alle Dateien des aktuellen Explorer-Fensters in exakt der selben Reihenfolge auf. Funktioniert ebenso, während im Explorer gerade gesucht wird.

Dann werde ich das jetzt aufhübschen und wasserdicht machen und beim Öffnen einer Datei als Liste hinterlegen, die bei Klick auf „Weiter“ und „Zurück“ verarbeitet wird …

Nachtrag: Das hier sieht mir sehr danach aus, dass das jemand copy-gepastet hat und in einen üblen Fehler gerannt ist. Naja, dafür hat Chen ja seine Disclaimer.

Nachtrag 2: Boah ist das eine überabstrahierte Scheiße. Man kann ausschließlich PIDLs relativ zum aktuellen Folder abfragen (um auch bloß jeden zu zwingen, sich rekursiv durch die Verzeichnisse zu hangeln). Wenn man auf Kinder zugreift, dann zwar durch ihre IStorage-Schnittstellen u.Ä., aber die sind so abstrakt, dass sie keine Dateipfade kennen. Ich suche jetzt seit einer Stunde, wie ich aus einer relativen PIDL einen Dateipfad mache.

(Manchmal wird vorgeschlagen, auf die IPersist2-Schnittstelle des Folders zuzugreifen. Dabei wird vergessen: Es ist ein Folder, kein Directory. Eine Suche z.B. ist kein IPersist2 und dementsprechend kriegt man dann keinen Pfad, obwohl jede Datei in den Suchergebnissen für sich theoretisch einen Pfad hat.)

Scheinbar muss ich die Child-PIDL erstmal zu einem parsable-String umwandeln, und den schiebe ich dann wieder in den PIDL-Parser um eine absolute PIDL zu bekommen, und die kann ich dann in einen Pfad umwandeln, falls die Datei tatsächlich durch einen Pfad adressierbar ist …
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Krishty
Establishment
Beiträge: 8238
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [WinAPI] Befinde ich mich in einer Suche?

Beitrag von Krishty »

Feddich — getestet unter Windows XP bis Windows 7. Funktioniert für echte wie virtuelle Verzeichnisse, Suchen, Papierkorb.

Hier ist das Monster:

Code: Alles auswählen

// For the given Explorer window, generates a list of paths (one for each visible item).
//  • returns “nullptr” on failure
//  • otherwise, returns an array of paths
//     — terminated with “nullptr”
//     — each path must be freed individually via “CoTaskMemFree()”
//  • paths strictly follow display order from the window
//  • the Explorer window is often the foreground window, but YMMV
WCHAR * * listPathsInExplorerWindow(HWND hwnd) {
	WCHAR * * result = nullptr;

	// Get the enumerator of all currently open Shell windows:
	IShellWindows * shellWindows;
	if(SUCCEEDED(CoCreateInstance(CLSID_ShellWindows, nullptr, CLSCTX_ALL, IID_IShellWindows, (void**)&shellWindows))) {

		// Iterate all windows via index:
		//  • the index must be a signed integer type (4-B unsigned has a special meaning)
		//  • check “Item()” for full success (even out-of-range accesses succeed partially)
		IDispatch * dispatch;
		VARIANT     shellWindowIndex;
		shellWindowIndex.vt   = VT_I4;
		shellWindowIndex.lVal = 0;
		while(S_OK == shellWindows->Item(shellWindowIndex, &dispatch)) {

			// Don’t know why this uses “IWebBrowserApp” specifically:
			//  • “IWebBrowserApp” is deprecated and information is impossible to find
			//  • for some reason, “IWebBrowserApp::get_HWND()” works fine, but “IShellBrowser::GetWindow()” is useless
			IWebBrowserApp * webBrowser;
			if(SUCCEEDED(dispatch->QueryInterface(IID_IWebBrowserApp, (void**)&webBrowser))) {

				// Is this the window we’re looking for?
				HWND suspectHWND;
				if(SUCCEEDED(webBrowser->get_HWND((LONG_PTR*)&suspectHWND)) && suspectHWND == hwnd) {

					// Getting a view of the currently open folder is mostly jumping through OOP hoops:
					//  • a folder view (“IFolderView”) is a kind of shell view (“IShellView”)
					//  • shell views are obtained from browsers (“IShellBrowser”)
					//  • browsers are services, so the current window must be a service provider (“IServiceProvider”)
					IServiceProvider * serviceProvider;
					if(SUCCEEDED(dispatch->QueryInterface(IID_IServiceProvider, (void**)&serviceProvider))) {
						IShellBrowser * shellBrowser;
						if(SUCCEEDED(serviceProvider->QueryService(SID_STopLevelBrowser, IID_IShellBrowser, (void**)&shellBrowser))) {
							IShellView * shellView;
							if(SUCCEEDED(shellBrowser->QueryActiveShellView(&shellView))) {
								IFolderView * folderView;
								if(SUCCEEDED(shellView->QueryInterface(IID_IFolderView, (void**)&folderView))) {

									// All item information is relative to the folder that is being viewed:
									IShellFolder * shellFolder;
									if(SUCCEEDED(folderView->GetFolder(IID_PPV_ARGS(&shellFolder)))) {

										// Enumerate all items in the folder view (not in the folder itself) — this minds the view order. E.g.:
										//  • if the user sorts files by date (ascending), get the results sorted by date (ascending)
										//  • if the user is searching a drive, get the search results in the displayed order
										int lengthOfResult;
										if(SUCCEEDED(folderView->ItemCount(SVGIO_FLAG_VIEWORDER + SVGIO_ALLVIEW, &lengthOfResult))) {

											// Reserve sufficient memory for the result:
											//  • consider the terminating “nullptr”
											//  • zero the memory so the terminating “nullptr” is handled implicitly
											if(auto pathList = (WCHAR * *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (lengthOfResult + 1) * sizeof *result)) {

												IEnumIDList * itemIterator;
												auto          toNextPath = pathList;
												if(SUCCEEDED(folderView->Items(SVGIO_FLAG_VIEWORDER + SVGIO_ALLVIEW, IID_IEnumIDList, (void**)&itemIterator))) {
													ITEMID_CHILD * childId;
													ULONG          dummyForXP; // “IEnumIDList::Next()” does not work on Windows XP without that
													while(S_OK == itemIterator->Next(1, &childId, &dummyForXP)) { // even out-of-range accesses succeed partially

														// Get the item’s path. I’m not entirely sure, but I think this is its “parsable display name”.
														STRRET path;
														path.uType = STRRET_WSTR; // politely ask for UTF-16
														if(SUCCEEDED(shellFolder->GetDisplayNameOf(childId, SHGDN_FORPARSING, &path))) {

															// The returned string may be of unexpected encoding, so guarantee UTF-16 via “StrRetToStr()”.
															//  • “StrRetToStrW()” deletes the orignal string
															//  • I can’t find any hints on graceful failure, so I ignore it (better have a leak than a double-free)
															if(SUCCEEDED(StrRetToStrW(&path, childId, toNextPath))) {
																++toNextPath;
															}

														}

														CoTaskMemFree(childId);
													}
													itemIterator->Release();

													// Store the result:
													result = pathList;
												}

												if(nullptr == result) { // don’t destroy the result
													HeapFree(GetProcessHeap(), 0, pathList);
												}
											}

										}

										shellFolder->Release();
									}

									folderView->Release();
								}
								shellView->Release();
							}
							shellBrowser->Release();
						}
						serviceProvider->Release();
					}

					break; // this was the window we’re looking for; no sense in further searching
				}

				webBrowser->Release();
			}

			dispatch->Release();
			++shellWindowIndex.lVal; // next window
		}

		shellWindows->Release();
	}

	return result;
}
Bin mir sicher, dass es die Windows-Fotogalerie auf die gleiche Art macht, nur dass sie das Fenster-Interface die ganze Zeit offen lässt – sie zeigt nämlich beim nächsten Foto das Thumbnail an, bis die Datei vollständig geladen wurde; und dafür braucht man die selben Shell-Interfaces.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Krishty
Establishment
Beiträge: 8238
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: (gelöst)[WinAPI] Befinde ich mich in einer Suche?

Beitrag von Krishty »

Da fällt mir ein nerviges Problem mit der Fotogalerie ein: Wenn man Dateien in den Ordner einfügt, nachdem die Fotogalerie bereits ein Bild darin betrachtet, muss man sie schließen und erneut öffnen um die neuen Dateien anzeigen zu können.

An dieser Stelle sollte man vielleicht das ganze Konzept überdenken, und anstelle eines Datensatzes Callbacks einfügen, so dass die Liste *während der Iteration* aktualisiert werden kann. Die Optionen dafür:
  1. Die Shell-Enumeration die ganze Zeit offen halten. Wenn das nächste Bild angezeigt werden soll, in der Enumeration vorwärts rücken. Probleme:
    • Die Shell erlaubt nur Vorwärtsbewegungen. Will man die vorherige Datei ansehen, wird der Code ziemlich eklig.
    • Ich habe keine Ahnung, was mit der Enumeration passiert, falls das Explorer-Fenster geschlossen wird.
    • Ich weiß überhaupt nicht, ob die Shell-Enumeration aktualisiert wird, wenn man neue Items einfügt. Vielleicht ist sie ja ebenfalls nur ein Schnappschuss eines bestimmten Zeitpunkts? Das würde erklären, warum die Windows-Fotogalerie diesen Fall verkackt.
  2. Sich für Benachrichtigung bei Änderungen am Verzeichnis registrieren und dann die Enumeration neu starten. Probleme:
    • Zu diesem Zeitpunkt befindet sich das Explorer-Fenster nicht mehr im Vordergrund. Man müsste das Handle speichern und hoffen, dass es nicht geschlossen und einem anderen Fenster auf dem System zugewiesen wurde.
    • Werden tausend Dateien eingefügt, enumeriert man tausend Mal das Verzeichnis — O(n²)
2. sieht nach weniger Stress aus … aber das Goldene vom Ei ist beides nicht. Die Informationslage ist auch einfach schrecklich; ich finde zu den Schnittstellen keine Information, die über „beim Aufruf dies angeben und dieser Typ kommt raus” hinausgeht.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4256
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

Re: (gelöst)[WinAPI] Befinde ich mich in einer Suche?

Beitrag von Chromanoid »

Ich hab keine Ahnung wie langsam die Abfrage ist, aber wäre es nicht vielleicht am einfachsten sich das Explorer-Handle zu merken und bei jedem Schritt nach vorne oder hinten, die Liste aller Items wie beim Öffnen des Explorers abzurufen. Statt das selektierte Element anzuwählen wird das aktuell angezeigte in der Liste gesucht und dann das davor oder dahinter angezeigt...
Benutzeravatar
Krishty
Establishment
Beiträge: 8238
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: (gelöst)[WinAPI] Befinde ich mich in einer Suche?

Beitrag von Krishty »

Das wiederum würde ziemlich sicher aufhören zu funktionieren, sobald man den Explorer schließt. Dann will ich ja immernoch durch die Dateien gehen können.

Wenn ich bei Änderungen alles neu abrufe, bin ich auch in der Zwickmühle: Falls mein aktuelles Bild gelöscht wurde, finde ich das vorherige Bild nicht mehr. Schließlich ist die ID nicht mehr in der Auflistung vorhanden. An der Stelle sollte man beim Index bleiben (würde einfach das nachfolgende Bild anzeigen), also beides speichern. Boah da gibt es richtig schön was zu abstrahieren …

Das wird langsam echt kleinlich, aber dieses eine Problem mit dem Ändern des Verzeichnisses und dem Neustarten der Fotogalerie hat sich als wirklich störend in mein Gedächtnis eingebrannt. Das muss ich besser hinkriegen :evil:

Kurze Zusammenfassung der klaren Use Cases:
  1. Doppelklick auf eine Bilddatei im Explorer. Knöpfe Vorwärts und Zurück in meinem Viewer müssen dann in Explorer-Reihenfolge durch die Bilder gehen (geht auch mit dem Code oben).
  2. Während der Viewer offen ist, werden neue Dateien ins Verzeichnis kopiert. Sie müssen dann in die Liste eingefügt werden, so dass Vorwärts und Zurück sie (noch immer in Explorer-Reihenfolge!) erreicht.
  3. Während der Viewer offen ist, wird die aktuelle Datei gelöscht. (Passiert tatsächlich recht häufig, wenn man beim Durchstöbern sieht, dass man Müll fotografiert hat.) Dann muss die nächste Datei (in Explorer-Reihenfolge) angezeigt werden.
  4. Während der Viewer offen ist, wird der Explorer geschlossen. Vorwärts und Zurück arbeiten dann entsprechend des letzten bekannten Zustands.
Unklare Use Cases:
  1. Während der Viewer offen ist, sortiere ich die Dateien im Explorer anders (z.B. nach Größe statt nach Name) und füge eine neue Datei ein. Wenn ich jetzt Vorwärts drücke, erreiche ich die nächste Datei nach Größe oder nach Name? Die Fotogalerie hat dieses Problem nicht, weil sie auf Änderungen nicht reagiert. Das ist so ein Grenzfall, da sollte ich einfach nach der Reihenfolge gehen, die mir der Explorer ausspuckt.
Davon abgeleitet:
  • Ich muss eine Referenz zum Explorer-Fenster halten, sonst funktionieren 2. & 3. nicht.
  • Ich muss die zuletzt enumerierte Liste speichern, sonst funktioniert 4. nicht.
  • Ich muss die ID der aktuellen Datei speichern, sonst funktioniert 2. nicht.
  • Ich muss den Listen-Index der aktuellen Datei speichern, sonst funktioniert 3. nicht.
Und ich kriege gerade ein ganz, ganz übles Gefühl bezüglich der Reaktion auf Änderungen: Was, wenn mein Viewer früher als der Explorer über die Änderungen benachrichtigt wird? Garnicht so unwahrscheinlich, weil der Explorer sicher deutlich höheren Arbeitsaufwand hat als ich. Dann bricht das Konzept zusammen.

Also bloß den Iterator als „veraltet“ markieren und beim Klick auf Vorwärts oder Zurück die neue Liste holen? Aber wie erkenne ich dann 3.?
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4256
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

Re: (gelöst)[WinAPI] Befinde ich mich in einer Suche?

Beitrag von Chromanoid »

Ich würde Dir weiterhin empfehlen, jedes Mal die Liste aus dem Explorer zu nehmen und Deine Datei darin zu suchen. Wenn sie gelöscht wurde, gehst Du die alte Liste solange nach vorne oder hinten durch, bis Du eine Datei gefunden hast, die auch in der neuen Liste vorhanden ist. Das ist dann der nächste Ausgangspunkt in der neuen Liste. So springt man in Deinem "unklaren Use Case", selbst wenn die Datei gelöscht wurde und dann noch neu sortiert wurde, zu einer Datei, die irgendwie Sinn macht. Wenn der Explorer geschlossen wurde, bleibst Du auf der alten Liste. Die Verbindung zum Explorer ist so nur sehr lose und auf kurze Momente der Synchronisation beschränkt. Ist der Explorer nicht mehr da, wird einfach nicht mehr synchronisiert. Das einzige was daran mMn problematisch sein könnte ist das ständige Synchronisieren bei sehr großen Listen.

Nachtrag: Man könnte das Synchronisieren vielleicht optimieren und auf weniger Momente beschränken, indem man feststellt, ob das Fenster überhaupt mal den Fokus verloren hat oder im Explorer zwischenzeitlich was passiert ist.
Benutzeravatar
Krishty
Establishment
Beiträge: 8238
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: (gelöst)[WinAPI] Befinde ich mich in einer Suche?

Beitrag von Krishty »

Gute Idee mit dem Abgleichen der Listen!

Bleibt das Problem mit der Reaktion auf Änderungen (zehrt der Explorer erst oder ich?). Was anderes, das ich vergessen habe: Man sollte irgendeine Form der ID für das aktuelle Verzeichnis speichern, damit der User im Fall von Änderungen nicht längst in einem anderen Verzeichnis ist und wir nun die falschen Dateien enumerieren. Wie man das hinkriegt ohne die Suchfunktion zu zerstören, wird nochmal interessant.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Alexander Kornrumpf
Moderator
Beiträge: 2112
Registriert: 25.02.2009, 13:37

Re: (gelöst)[WinAPI] Befinde ich mich in einer Suche?

Beitrag von Alexander Kornrumpf »

Lange off-topic Vorrede
Um mal den Technikphilosophen raushängen zu lassen, die Funktionsweise des eigenen Programms an ein davon unabhängiges Explorerfenster zu binden ist natürlich genau die Art von Automagie wegen derer "normale User" es ums Verrecken nicht hinbekommen ein funktionierendes mentales Modell davon aufzubauen, was in ihrem Computer passiert. Dieses Argument schneidet durchaus in beide Richtungen. Dass deine Lösung, die ich instinktiv als coolen aber üblen Hack klassifizieren würde überhaupt einigermaßen funktioniert (wenn nicht...), weckt beim User Erwartungen an das was Rechner können sollten, die schlicht nicht systematisch erfüllbar sind. Wo "einigermaßen" aber nicht reicht, sind User über Jahre an derartig obskure Ursache-Wirkungszusammenhänge gewöhnt worden, dass sie mit der Fehlerdiagnose verständlicherweise überfordert sind.

Schwer zu sagen, was die Lösung dafür sein soll. Erinnert ein wenig an die Textverarbeitungsdiskussion neulich. User Interaction ist ein verdammt hartes Problem.
Ich weiß nicht wie sehr ich als Focus-User tauge, aber ich persönlich würde es bevorzugen eine Liste im Programm explizit sortieren, aktualisieren etc. zu können, statt eine komplexe (das ist ja hoffentlich unstrittig) Interaktion mit dem Explorerfenster durchblicken zu müssen.

[EDIT] Einen noch:
Mir ist klar, dass mein Vorschlag mehr oder weniger darauf hinausläuft, Explorer-Funktionalität im eigenen Programm zu replizieren. Ich habe aber ein Gegenargument: Es scheint hier um Bilder zu gehen und ein anderer Use-Case fällt mir nicht ein. Es ist schon erstaunlich, durch welche Reifen Microsoft springt, um diesen absoluten Randfall in ihren Explorer zu integrieren. Siehe thumbs.db und eben der hier diskutierte Image Viewer. Ist beides nicht Explorers Kerngeschäft, auch wenn ich die Zielgruppe dafür verstehe. In anderen Worten, es ist ja nicht meine Schuld, dass Explorer Dinge kann, die es nicht können sollte.
Benutzeravatar
Krishty
Establishment
Beiträge: 8238
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: (gelöst)[WinAPI] Befinde ich mich in einer Suche?

Beitrag von Krishty »

Alexander Kornrumpf hat geschrieben:Ich weiß nicht wie sehr ich als Focus-User tauge, aber ich persönlich würde es bevorzugen eine Liste im Programm explizit sortieren, aktualisieren etc. zu können, statt eine komplexe (das ist ja hoffentlich unstrittig) Interaktion mit dem Explorerfenster durchblicken zu müssen.
[…]
Mir ist klar, dass mein Vorschlag mehr oder weniger darauf hinausläuft, Explorer-Funktionalität im eigenen Programm zu replizieren.
Ja, absolut – Dateisuche und Thumbnails wären dabei essentielle Dinge (nutze ich dutzende bzw. hunderte Male pro Tag), aber zum Selberschreiben bräuchte ich da Jahrzehnte. Und am Ende wären es dann zwei Interfaces, die ich lernen muss, statt einem.
Ich habe aber ein Gegenargument: Es scheint hier um Bilder zu gehen und ein anderer Use-Case fällt mir nicht ein.
Ich nutze die Fotogalerie als Thumbnail on Steroids: Doppelklick, reinzoomen, nö das ist nicht die Datei; nächste. Dass ich andere Dateitypen (PDFs?) immer erst mit fetten Drittprogrammen öffnen muss, macht mich regelmäßig wütend. Die XP-Bildvorschau konnte GIFs abspielen (früher war alles besser ;) ); die Windows-10-Bildvorschau kann Videos abspielen – da geht’s hin.
Es ist schon erstaunlich, durch welche Reifen Microsoft springt, um diesen absoluten Randfall in ihren Explorer zu integrieren. Siehe thumbs.db und eben der hier diskutierte Image Viewer.
Ich habe einen Kollegen, der ist so ein Kommandozeilenmensch und kann mit Dingen, die keine Eingabefelder haben, absolut nichts anfangen. Vielleicht bist du auch so einer :) Ich jedenfalls nicht – ich benutze die Fotogalerie dutzende Male am Tag (allein für Debug-Visualisierungen meiner Algorithmen unschätzbar). Dass Microsoft sie nach Windows 7 so extrem verkackt hat (neue Bedienphilosophie; geht jetzt in den Tile-Modus; Hälfte der Controls unsichtbar; andere Hälfte verdeckt die Bildfläche) ist einer meiner Gründe, erstmal bei Windows 7 zu bleiben. Vielleicht saß bei Microsoft ein Typ, der sich genau so gern durch Dinge durchklickt wie ich, und der hat via Dogfeeding gemerkt, dass er seine Arbeitszeit halbieren kann, wenn die Galerie mit Suchergebnissen funktioniert. Und für Windows 8 haben sie ihn gefeuert.

Übrigens habe ich auch über die andere Richtung nachgedacht: meine Viewer-Funktionalität als Plugin für die Fotogalerie entwickeln. (Geht als Codec via noch mehr COM-Gefrickel.) Nachdem Microsoft die 7er-Galerie aber mehr als deutlich aufgegeben hat, baue ich lieber was, das ich die nächsten zehn Jahre migrieren kann.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4256
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

Re: (gelöst)[WinAPI] Befinde ich mich in einer Suche?

Beitrag von Chromanoid »

Um auf Alexanders Einwand einzugehen: Man könnte unten in der Statusleiste des Viewers einen Hinweis auf die Verbindung mit dem Explorer-Fenster geben: [Mit Microsoft Explorer verbunden]
Wenn man darüber hovered, kommt ein Tooltip: "Zur verbundenen Anwendung springen und aktuelle Datei auswählen." Wird das Explorer-Fenster geschlossen, erscheint in der Statusleiste für eine kurze Zeit ein Hinweis [Verbundene Anwendung Microsoft Explorer wurde geschlossen].

Ich hasse "extra Explorer". Ich bin prinzipiell mit dem Dateisystem unzufrieden, mir wäre irgendwas kluges mit Kategorien lieber, am besten Facettenklassifikation. Aber ich lehne es auch ab, irgendein Programm zu nutzen, das dann einen riesigen unsortierten Haufen Dateien nur in dem Programm in einer Ordnung erscheinen lässt...

Was die Fotogalerie usw. angeht, lege ich ein ähnliches Verhalten wie Krishty an den Tag. Wobei ich in der letzten Zeit eher sammle und nur selten über das gesammelte rüberschaue.
Krishty hat geschrieben:Man sollte irgendeine Form der ID für das aktuelle Verzeichnis speichern
Wieso nicht einfach den Pfad der oben in der Explorer-Eingabeleiste angezeigt wird?
Benutzeravatar
Krishty
Establishment
Beiträge: 8238
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: (gelöst)[WinAPI] Befinde ich mich in einer Suche?

Beitrag von Krishty »

Der ist nicht eindeutig – C:\Users\Krishty\Desktop entspricht Desktop; C:\Benutzer entspricht C:\Users usw usf. Die PIDL des Verzeichnisses funktioniert nicht mit Suchen (glaube ich?). Aber vielleicht ist der Anzeigestring ja schon „gut genug“; Overengineering haben wir in diesem Thread ja schon zu genüge ;)
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4256
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

Re: (gelöst)[WinAPI] Befinde ich mich in einer Suche?

Beitrag von Chromanoid »

Ah verstehe. Hehe, stimmt. Overengineering hat auf ZFX sowieso nichts zu suchen :D.
Benutzeravatar
Krishty
Establishment
Beiträge: 8238
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: (gelöst)[WinAPI] Befinde ich mich in einer Suche?

Beitrag von Krishty »

Na toll … bei vielen Dateien (~10.000; bei meinen Suchen aber nichts Ungewöhnliches) kann das Ganze schonmal zehn Sekunden laden. Also muss auch noch Multi-Threading rein …

Für heute bin ich erstmal froh, dass überhaupt das Browsen (ohne Änderungen) geht. Dass modale Dialoge keine Tastenkombinationen unterstützen, hat (mal wieder) meine halbe UI durcheinandergebracht …
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Alexander Kornrumpf
Moderator
Beiträge: 2112
Registriert: 25.02.2009, 13:37

Re: (gelöst)[WinAPI] Befinde ich mich in einer Suche?

Beitrag von Alexander Kornrumpf »

Krishty hat geschrieben:Ja, absolut – Dateisuche und Thumbnails wären dabei essentielle Dinge (nutze ich dutzende bzw. hunderte Male pro Tag), aber zum Selberschreiben bräuchte ich da Jahrzehnte. Und am Ende wären es dann zwei Interfaces, die ich lernen muss, statt einem.
Mir ist hinterher eingefallen, dass ein Weg darin bestünde, dass Explorer das als API offen legt. Zum Teil ist das wahrscheinlich jetzt schon so.
Übrigens habe ich auch über die andere Richtung nachgedacht: meine Viewer-Funktionalität als Plugin für die Fotogalerie entwickeln. (Geht als Codec via noch mehr COM-Gefrickel.) Nachdem Microsoft die 7er-Galerie aber mehr als deutlich aufgegeben hat, baue ich lieber was, das ich die nächsten zehn Jahre migrieren kann.
Oder sorum. Was mich "stört" ist eine Verbindung zwischen zwei Fenstern (!) die nicht zur selben Anwendung gehören. Ich hätte nicht erwartet, dass du mit einer Lösung zufrieden bist, die zwangsläufig in einen failure Mode fallen muss, wenn der User ein Fenster schließt, auf das du keinen Einfluss hast. Egal wie gracefully das passiert. Vielleicht steigere ich mich aber auch in was rein. Wie gesagt, ich betrachte das als ein Beispiel für ein größeres Phänomen. Meinungen dazu?
Chromanoid hat geschrieben:Um auf Alexanders Einwand einzugehen: Man könnte unten in der Statusleiste des Viewers einen Hinweis auf die Verbindung mit dem Explorer-Fenster geben: [Mit Microsoft Explorer verbunden]
Wenn man darüber hovered, kommt ein Tooltip: "Zur verbundenen Anwendung springen und aktuelle Datei auswählen." Wird das Explorer-Fenster geschlossen, erscheint in der Statusleiste für eine kurze Zeit ein Hinweis [Verbundene Anwendung Microsoft Explorer wurde geschlossen].

Ich hasse "extra Explorer". Ich bin prinzipiell mit dem Dateisystem unzufrieden, mir wäre irgendwas kluges mit Kategorien lieber, am besten Facettenklassifikation. Aber ich lehne es auch ab, irgendein Programm zu nutzen, das dann einen riesigen unsortierten Haufen Dateien nur in dem Programm in einer Ordnung erscheinen lässt...
Sowohl den Einwand als auch den Lösungsvorschlag finde ich plausibel.
Benutzeravatar
Krishty
Establishment
Beiträge: 8238
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: (gelöst)[WinAPI] Befinde ich mich in einer Suche?

Beitrag von Krishty »

Alexander Kornrumpf hat geschrieben:Oder sorum. Was mich "stört" ist eine Verbindung zwischen zwei Fenstern (!) die nicht zur selben Anwendung gehören. Ich hätte nicht erwartet, dass du mit einer Lösung zufrieden bist, die zwangsläufig in einen failure Mode fallen muss, wenn der User ein Fenster schließt, auf das du keinen Einfluss hast. Egal wie gracefully das passiert.
Naja; das 2. Fenster (mein Viewer) wird direkt aus dem ersten Fenster (dem Explorer) heraus gestartet. Es ist ja nicht so, dass ich erstmal auf den Desktop wechsle, ein neues Programm starte, und das sucht sich irgendein anderes Fenster auf dem System und beschließt, heute mal die Items in der selben Reihenfolge wie dort zu listen ;) Diese mentale Verbindung weicht natürlich mit der Zeit auf (vielleicht schon nach dem ersten Fokus-Wechsel), aber in den meisten Use Cases bleibt ein Viewer ja nur kurz offen.

Ist dir das denn bisher schonmal passiert, dass du auf ein Bild geklickt hast, und das Nächste, und dir dachtest: „STOP! Das ist jetzt aber nicht nach Dateinamen sortiert, sondern nach der Reihenfolge in dem Explorer, auf dessen Item ich geklickt habe! Das verwirrt mich und macht mich wütend!“? Bei mir war nämlich genau das Gegenteil der Fall – dass sie in der Explorer-Reihenfolge auftauchen, habe ich nicht gemerkt, bis es mal kaputtgegangen ist (neue Dateien in Ordner eingefügt).

Ich weiß, dass es dir ums größere Ganze geht, nur gerade in der UI-Entwicklung muss man sehr viel praktisch testen …
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Krishty
Establishment
Beiträge: 8238
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: (gelöst)[WinAPI] Befinde ich mich in einer Suche?

Beitrag von Krishty »

Hier übrigens mal ein paar Benchmarks:
  • Richtiges Explorer-Fenster finden: 125–140 ms
    Das ist schon erheblich; ich bin von meinen Programmen deutlich schnellere Startzeiten gewohnt …
  • Verzeichnis mit fünf Dateien enumerieren: 500–530 ms
    WTF?! In der Zeit könnte ich ein paar Millionen Pixel Raytracen! Wie soll man das denn bitteschön dem User erklären?!
  • Verzeichnis mit 10.000 Dateien enumerieren: 830–1250 ms
    better than expected
  • Suche mit 20.000 Ergebnissen enumerieren (erstes Mal): ~3000 ms
  • Suche mit 20.000 Ergebnisses enumierieren (zweites Mal): 1000–1300 ms
Na dann hoffen wir mal, dass der User nicht innerhalb der ersten zwei Sekunden auf irgendwas klickt … fuckfuckfuckfuckfuck

Bevor ich es in eigene Threads verpacken kann, muss ich erstmal zusehen, dass die COM-Schnittstellen Multithreading-tauglich sind …
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Alexander Kornrumpf
Moderator
Beiträge: 2112
Registriert: 25.02.2009, 13:37

Re: (gelöst)[WinAPI] Befinde ich mich in einer Suche?

Beitrag von Alexander Kornrumpf »

Krishty hat geschrieben:Naja; das 2. Fenster (mein Viewer) wird direkt aus dem ersten Fenster (dem Explorer) heraus gestartet. Es ist ja nicht so, dass ich erstmal auf den Desktop wechsle, ein neues Programm starte, und das sucht sich irgendein anderes Fenster auf dem System und beschließt, heute mal die Items in der selben Reihenfolge wie dort zu listen ;)
Naja, du hast mindestens einen Race-Condition drin, dass ich das Fenster schließen könnte, bevor dein Viewer den Code ausführen kann, der zu dem Fenster verbindet. Ich muss, wie ich dich kenne, zwar annehmen, dass dein Viewer so schnell startet, dass ich das Rennen in der Praxis nie gewinnen werde, ich finde es aber schon unbefriedigend, dass es überhauot so ist. Mein Punkt ist gar nicht so sehr, dass es nicht so funktionieren sollte wie du es dir vorstellst. Mein Punkt ist, dass ich als User eine mentale Verbindung zwischen dem Inhalt des Fensters und dem Verhalten deines Viewers aufbaue, nicht mit dem Fenster _an sich_. Sollte ich also einmal in 1000 Jahren durch einen kosmischen Zufall das Rennen gewinnen und in den failure Mode geraten, den du sicherlich einbauen wirst, würde ich im Leben nicht drauf kommen, dass es daran liegt, dass ich das Fenster geschlossen habe. Das ist es was ich ungut finde. Dein Eingangspostig hatte ich so verstanden, dass dir auch zuerst nicht klar war, wie der Windows-Viewer das macht, obwohl du es dauernd nutzt und Programmierer bist. Wie soll der User es dann verstehen. Oder andersrum: Wenn der User es nicht verstehen kann oder soll, muss es sich wenigstens immer und unter allen Umständen gleich verhalten. Was hier technisch unmöglich scheint.
Diese mentale Verbindung weicht natürlich mit der Zeit auf (vielleicht schon nach dem ersten Fokus-Wechsel), aber in den meisten Use Cases bleibt ein Viewer ja nur kurz offen.

Ist dir das denn bisher schonmal passiert, dass du auf ein Bild geklickt hast, und das Nächste, und dir dachtest: „STOP! Das ist jetzt aber nicht nach Dateinamen sortiert, sondern nach der Reihenfolge in dem Explorer, auf dessen Item ich geklickt habe! Das verwirrt mich und macht mich wütend!“?
Ich benutze das wirklich quasi nie. Ich habe ein anderes Beispiel: Ich nutze ein Programm, das KeePass heißt. Damit kannst du Passwörter in die Zwischenablage kopieren und nach 30 Sekunden oder wenn man das Programm schließt, leert es aus Sicherheitsgründen die (eigene) Zwischenablage. Ob das wirklich ein Sicherheitsgewinn ist, weiß ich nicht, ich kann mir Attacken vorstellen, bei denen es wenigstens ein bisschen hilft. Was ich weiß ist, dass ich bestimmt schon 100 Mal Strg+C->Fenster schließen->Strg+V->Fuuuuuu gemacht habe, weil ich nicht erwarte, dass ich ein Fenster, das ich nicht mehr brauche offenhalten muss. Ich weiß was passiert, ich weiß warum, aber mein implizites mentales Modell kann das nicht verarbeiten.
Bei mir war nämlich genau das Gegenteil der Fall – dass sie in der Explorer-Reihenfolge auftauchen, habe ich nicht gemerkt, bis es mal kaputtgegangen ist (neue Dateien in Ordner eingefügt).
Bingo. Ich hatte verstanden, dass du, von meiner vielleicht akademischen Rece-Condition oben abgesehen, technisch quasi nicht garantieren kannst, dass es nie kaputtgeht. In deinem Usecase vom Einfügen neuer Dateien hast du Fokusverlust, Aufweichen der Mentalen Verbindung und eine erstklassige Gelegenheit das Fenster zu schließen gleichzeitig. Ich geb dir ne 50:50 Chance. Und eins kann ich versprechen: Ein Programm das (auf diesen Usecase bezogen) in 50% der Fälle so und in 50% der Fälle anders funktioniert, ohne dass die Ursache offensichtlich ist, würde mich, deine Worte, richtig wütend machen. Auch bei 80/20 noch. 99/1 wäre wahrscheinlich akzeptabel.
Ich weiß, dass es dir ums größere Ganze geht, nur gerade in der UI-Entwicklung muss man sehr viel praktisch testen …
Nur um es nochmal ganz deutlich zusagen: Solange es funktioniert habe ich keine Einwände gegen das Feature. Das "große Ganze" ist hier, dass Programme nicht darüber lügen sollen, was sie können. Wenn du nicht garantieren kannst, dass es beim Einfügen von Dateien weiter funktioniert, und das kannst du nach meinem Verständnis nicht, denn, wie das Beispiel KeePass zeigt, ich würde das Fenster nach dem Einfügen auch dann schließen, wenn ich eigentlich weiß, dass ich nicht sollte, dann fühle ich mich verarscht, wenn es manchmal geht.

Ich habe lieber den geringeren Komfort z. B. immer händisch auf "Aktualisieren" klicken zu müssen auf das es immer funktioniert, als dass das Programm für mich entscheidet, wann ich von Vorne anfangen darf. KeePass lasse ich das nur durchgehen, weil es zumindest einen kleinen erkennbaren Sinn hat, und nicht "ging nicht besser" ist.

Ich bin nicht sicher, was du mit "praktisch testen" meinst. Würdest du User fragen, würden sie dir sagen, dass sie die Komfortfuinktion wollen, scheiß auf den Fehlerfall. Das ist mir schon klar. Aber dann wunder dich bitte nicht im anderen Thread, was User bereit sind für einen Buillshit hinzunehmen. Die Entwickler sind es doch, die den Usern antrainiert haben, dass sie diesen Komfort nur um den Preis von unerklärlichen Fehlern am anderen Ende bekommen. Nach der fiktiven Welt in der mein Klick auf aktualisieren an der Tagesordnung ist, aber dafür nie etwas kaputt geht, kannst du den User ja leider nicht fragen.
Alexander Kornrumpf
Moderator
Beiträge: 2112
Registriert: 25.02.2009, 13:37

Re: (gelöst)[WinAPI] Befinde ich mich in einer Suche?

Beitrag von Alexander Kornrumpf »

Krishty hat geschrieben:Na dann hoffen wir mal, dass der User nicht innerhalb der ersten zwei Sekunden auf irgendwas klickt … fuckfuckfuckfuckfuck
Wir haben uns bei Posting überschnitten, genau das Problem hatte ich oben gesehen. Zwei Sekunden sind vermutlich inakzeptabel. Wenn ich es drauf anlege vermute ich in zwei Sekunden ein Fenster schließen zu können. Sorry.
Benutzeravatar
Krishty
Establishment
Beiträge: 8238
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: (gelöst)[WinAPI] Befinde ich mich in einer Suche?

Beitrag von Krishty »

Ich bin nicht sicher, was du mit "praktisch testen" meinst. Würdest du User fragen, würden sie dir sagen, dass sie die Komfortfuinktion wollen, scheiß auf den Fehlerfall. Das ist mir schon klar. Aber dann wunder dich bitte nicht im anderen Thread, was User bereit sind für einen Buillshit hinzunehmen. Die Entwickler sind es doch, die den Usern antrainiert haben, dass sie diesen Komfort nur um den Preis von unerklärlichen Fehlern am anderen Ende bekommen.
Geht es um die Grafiktreiber? Ich finde nicht, dass die komfortable Lösung da *irgendein* Klick ist, sondern dass Windows im Hintergrund via Update den Treiber installiert; ohne, dass ich jemals was merke. Ich habe nie verstanden, was diese Installationsmanager und Control Centers und Launch Managers mit Komfort zu tun haben sollen :)
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Krishty
Establishment
Beiträge: 8238
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: (gelöst)[WinAPI] Befinde ich mich in einer Suche?

Beitrag von Krishty »

Alexander Kornrumpf hat geschrieben:Wir haben uns bei Posting überschnitten, genau das Problem hatte ich oben gesehen. Zwei Sekunden sind vermutlich inakzeptabel. Wenn ich es drauf anlege vermute ich in zwei Sekunden ein Fenster schließen zu können. Sorry.
Ja; lass mich aber erstmal weiter benchen. Es sieht schonmal so aus, dass 120 ms für IShellWindows draufgehen und der Rest garnicht erst messbar ist. Da lässt sich sicher was rausholen. Auch die Enumeration gucke ich mir nochmal genauer an.

Zur Praxis: Beobachte User und prüf, wie oft der Fehlerfall bei ihnen eingetreten ist. Explorer in unter zwei Sekunden nach Doppelklick auf Icon und mit neuem Vordergrundfenster schließen ist sportlich. Gut möglich, dass die Fotogalerie dabei ebenfalls kaputtgeht, und ich das bloß noch nie geschafft habe. Gut möglich, dass COM die Enumeration offenhält sobald ich sie einmal angefragt habe, und dass das Zeitfenster eher bei 0,12 Sekunden liegt. Wir forschen ja noch.

Nachtrag: Innerhalb eines sehr kurzen Zeitraums nach dem Starten der Fotogalerie reagiert der Explorer garnicht auf Schließen:
  • Ordner mit vielen JPGs öffnen
  • eins markieren
  • Maus schonmal in Position über X bringen
  • sehr schnell hintereinander ENTER drücken (startet die Galerie) und klicken (soll Explorer schließen)
  • Explorer geht nicht zu
  • Galerie startet deutlich schneller als 2 Sekunden :(
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Alexander Kornrumpf
Moderator
Beiträge: 2112
Registriert: 25.02.2009, 13:37

Re: (gelöst)[WinAPI] Befinde ich mich in einer Suche?

Beitrag von Alexander Kornrumpf »

Krishty hat geschrieben:Geht es um die Grafiktreiber? Ich finde nicht, dass die komfortable Lösung da *irgendein* Klick ist, sondern dass Windows im Hintergrund via Update den Treiber installiert; ohne, dass ich jemals was merke. Ich habe nie verstanden, was diese Installationsmanager und Control Centers und Launch Managers mit Komfort zu tun haben sollen :)
OK, dann hatte ich einen spezifischen Kommentar von dir zu allgemein ausgelegt.
Alexander Kornrumpf
Moderator
Beiträge: 2112
Registriert: 25.02.2009, 13:37

Re: (gelöst)[WinAPI] Befinde ich mich in einer Suche?

Beitrag von Alexander Kornrumpf »

Krishty hat geschrieben: Zur Praxis: Beobachte User und prüf, wie oft der Fehlerfall bei ihnen eingetreten ist.
Zwei Ergänzungen:

1) Mit Bayes musst du natürlich prüfen, wie oft der Fehlerfall eintritt wenn Dateien eingefügt werden. Dass dieser Usecase an sich selten ist würde sonst das Ergebnis ziemlich verzerren.

2) Du braucht irgendeine Art Gewichtung. Ein Fehler beeinflusst die User Experience stärker als n Mal, die es funktioniert.
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4256
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

Re: (gelöst)[WinAPI] Befinde ich mich in einer Suche?

Beitrag von Chromanoid »

Krishty hat geschrieben:Nachtrag: Innerhalb eines sehr kurzen Zeitraums nach dem Starten der Fotogalerie reagiert der Explorer garnicht auf Schließen: ...
Also ich benutze Win 10 und wenn ich da die Fotogalerie geöffnet habe und direkt nach dem Öffnen das nächste Bild will, dauert das ein Weilchen. Zudem ist es bei meinem System so, dass solange die Suche noch nicht abgeschlossen ist, das Weiterklicken in der Diashow vorläufig nicht oder sogar nie funktioniert. Den Explorer konnte ich auch schnell schließen und dann konnte ich auch nicht das nächste Bild anschauen. Ich hatte dann auch noch mal kurz IfranView ausprobiert, da nimmt er glaube ich die nächste Datei nach Namen, egal was im Explorer ist. Die Funktion der Fotogalerie, sei sie auch noch so fragil, finde ich besser und intuitiver. Wenn die "nächstes Bild"-Funktion mal nicht funktioniert, schließe ich glaube ich unbewusst die Fotogalerie und öffne das Bild erneut, komplett im Autopilot...
Antworten