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 Windowsordner
    

    Allerdings 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


  • Mod

    SendMessage kehrt zurück wenn der Explorer seinen Job getan hat, dann kannst Du auch den Speicher wieder freigeben.


Anmelden zum Antworten