Explorer.exe --- Aus Programm starten und mehrere Dateien markieren
-
Hallo,
ich habe wiedereinmal ein Problem.
Un zwar möchte ich aus einem Programm den explorer.exe starten und dann mehrere Datein markieren.Mit einer einzelnen Datei funktioniert das schon sehr gut mit:
ShellExecute(GetSafeHwnd(),L"open",_T("C:\\Windows\\explorer.exe"),_T("/select, C:\\Windows"),NULL,SW_SHOWDEFAULT); //Das öffnet den Explorer und markiert den WindowsordnerAllerdings suche ich jetzt schon länger erfolglos nach einer Möglichkeit mehrere Dateien markieren zu lassen, wie es zum Beispiel beim Windows Media Player funktioniert. Da kann ich einige Dateien aus der Medienbibliothek auswählen und dann per rechtsklick "Dateispeicherort öffnen" markiert in einem Explorer Fenster anzeigen lassen.
Kann mir jemand helfen?
Liebe grüße
eXitus
-
nach etwas googlen koennte man zu dem schluss kommen, dass das, was du moechtest, so gar nicht moeglich ist.
http://www.emacswiki.org/emacs/w32-browser.el
da steht:[...]
;;; Apparently, /select can specify only one file, and only one /select can be used.
[...]mfg,
julian
-
Hi,
deshalb meine Frage, ob das irgendwie möglich ist. Hast du eine Idee wie sich das realisieren lassen könnte?eXitus
-
hallo,
ich bin jetzt nach einigen Stunden rumprobieren auf das hier gekommen:
//Durch die ganzen Fenster zum ListView des Explorers kämpfen HWND FindWIn = ::FindWindow(_T("CabinetWClass"),_T("IchBinEinTestOrdner")); //Der Fenstertitel ist hier der Ordnername FindWIn = ::FindWindowEx(FindWIn,NULL,_T("ShellTabWindowClass"),_T("IchBinEinTestOrdner")); FindWIn = ::FindWindowEx(FindWIn,NULL,_T("DUIViewWndClassName"),_T("")); FindWIn = ::FindWindowEx(FindWIn,NULL,_T("DirectUIHWND"),_T("")); HWND FindWIn2 = ::FindWindowEx(FindWIn,NULL,_T("CtrlNotifySink"),_T("")); FindWIn2 = ::FindWindowEx(FindWIn,FindWIn2,_T("CtrlNotifySink"),_T("")); FindWIn2 = ::FindWindowEx(FindWIn,FindWIn2,_T("CtrlNotifySink"),_T("")); FindWIn2 = ::FindWindowEx(FindWIn,FindWIn2,_T("CtrlNotifySink"),_T("")); FindWIn = ::FindWindowEx(FindWIn,FindWIn2,_T("CtrlNotifySink"),_T("")); FindWIn = ::FindWindowEx(FindWIn,NULL,_T("SHELLDLL_DefView"),_T("ShellView")); //Damit wären wir beim SysListView32 des Explorers CWnd* TmpExplorer = FindWindowEx(FindWIn,NULL,_T("SysListView32"),_T("FolderView")); //Test legt fest, was nachher an dem ItemState geändert werden soll //InProcess ist ein Zeiger, der später auf dem fremnden Prozess zeigt LVITEM Test, *InProcess; Test.state = LVIS_SELECTED|LVIS_FOCUSED; Test.stateMask = LVIS_SELECTED |LVIS_FOCUSED; Test.iItem = 0; //ProcessID abfragen unsigned long ProcessID; GetWindowThreadProcessId(TmpExplorer->GetSafeHwnd(), &ProcessID); //Handle auf den Prozess holen HANDLE HandleToProcess = OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITE|PROCESS_QUERY_INFORMATION,FALSE,ProcessID); //Speicher im fremden Prozess allokieren InProcess = (LVITEM*)VirtualAllocEx(HandleToProcess,NULL,sizeof(LVITEM),MEM_COMMIT, PAGE_READWRITE); WriteProcessMemory(HandleToProcess,InProcess,&Test,sizeof(LVITEM),NULL); //Endlich die Nachricht abschicken TmpExplorer->SendMessage(LVM_SETITEMSTATE,(WPARAM)(int)-1,(LPARAM)InProcess); //Speicher wieder freigeben VirtualFreeEx(HandleToProcess, InProcess, 0, MEM_RELEASE);Nachdem es mich viele Nerven gekostet hat warum der Explorer ein Zufallsverhalten an den Tag legt.... bin ich dann drauf gekommen, dass ich ja einen Zeiger an einen anderen Prozess schicke und der damit nichts anfangen kann.
Darf ich den Speicher so früh schon wieder freigeben oder kann es dann sein, dass explorer.exe wieder verrückt spielt?
Gruß
eXitus
-
SendMessage kehrt zurück wenn der Explorer seinen Job getan hat, dann kannst Du auch den Speicher wieder freigeben.