Pfad irgendeines offnen Fensters ermitteln!



  • Angelus2008 schrieb:

    GetModuleFile...:0

    wenn GetModuleFileNameEx 0 zurückgibt, ist sie fehlgeschlagen.
    Also muss es daran liegen. Kannst ja mal GetLastError() aufrufen



  • Thx für den Tipp also ich denk ich weis was das Problem ist, ich weis nur net wie ich es lösen kann ^^, mein Code:

    string test = "";
       DWORD aufnehmen = NULL, aufnehmen2 = NULL, pid = NULL;
       char name[MAX_PATH];
       HANDLE handle = NULL;
       HWND hwnd = NULL;
    
       hwnd = ::FindWindowA(0, "Rechner");
    
       DWORD tester = GetLastError();
    
       cout << "FindWindowA ERROR: " << tester << endl;
    
       aufnehmen = GetWindowThreadProcessId(hwnd, &pid);
    
       DWORD tester2 = GetLastError();
    
       cout << "GetWindowThreadProcessId ERROR: " << tester2 << endl;
    
       handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
    
       DWORD tester3 = GetLastError();
    
       cout << "OpenProcess ERROR: " << tester3 << endl;
    
       aufnehmen2 = GetModuleFileNameExA(handle, NULL, name, MAX_PATH);
    
       DWORD tester4 = GetLastError();
    
       cout << "GetModuleFileNameExA ERROR: " << tester4 << endl;
    

    Meine Ausgabe:

    FindWindowA ERROR: 0
    GetWindowThreadProcessId ERROR: 0
    OpenProcess ERROR: 5
    GetModuleFileNameExA ERROR: 6

    Somit weis ich dass mir bei OpenProcess der Zugriff verweigert wird un dadurch bei GetModuleFileNameExA der handle ungütlig ist. Wie kann ich das Problem lösen? Hab schon die access rights verändert um zu schauen was passiert hab zwar dann bei OpenProcess ERROR ne 0 also keinen Fehler, aber dafür hab ich dann bei GetModuleFileNameExA ne 5.



  • Hey,

    wollte euch nochm auf mein Problem aufmerksam machen un auf meine jetzige Lösung (s.O.)

    Thx im Voraus
    Angelus2008


  • Mod

    Du solltest Dir nicht alle Rechte besorgen (PROCESS_ALL_ACCESS), sondern nur die, die Du auch benötigst (PROCESS_QUERY_INFORMATION und PROCESS_VM_READ)!



  • Ah wunderbar danke dir hat mit der calc.exe un mit den veränderten Parametern super funktioniert, hatte unter anderem auch PROCESS_VM_READ versucht aber es fehlte noch der andere 😉 echt super, wenn das mit dem anderen auch so funzt liebe ich das Forum jetzt schon xD

    Schönen Tag noch.

    MfG Angelus2008



  • Nach dem Erfolgserlebnis welches mir mein Programm nun den Pfad der jeweiligen Windows anzeigt, habe ich das nächste Problem, es wurde schonma angesprochen soweit ich weis un es ist für mich einleuchtend aber nicht zu lösen.

    #include <iostream>
    #include <iomanip>
    #include <conio.h>
    #include <vector>
    #include <windows.h>
    #include <direct.h>
    #include <process.h>
    #include <string>
    #include <psapi.h>
    #pragma comment(lib, "psapi.lib")
    using namespace std;
    
    class HKEYS
    {
       private:
          SHORT status;
          char *path, concatIt[20], container[20];
          int counter;
          vector<int> myArray;
       public:
          HKEYS();
          void makeFiles(int, int);
          void startApps(int);
          void editKeys();
    };
    
    HKEYS::HKEYS()
    {
       //strg + n = neuer Ordner, strg + alt + i = IE öffnen
       //strg + alt + h = html datei erstellen, strg + alt + t = txt datei erstellen
       //strg + alt + b = bat datei erstellen, strg + alt + c = cmd öffnen
       //strg + alt + w = doc datei erstellen, strg + alt + x = xls datei erstellen
       status = 0, counter = 0;
       path = "Ordner";
       myArray.push_back(VK_CONTROL); //strg index: 0 (Wert: 17)
       myArray.push_back(VK_MENU); //alt index: 1 (Wert: 18)
       myArray.push_back(0x42); //b index: 2 (Wert: 66)
       myArray.push_back(0x43); //c index: 3 (Wert: 67)
       myArray.push_back(0x48); //h index: 4 (Wert: 72)
       myArray.push_back(0x49); //i index: 5 (Wert: 73)
       myArray.push_back(0x4E); //n index: 6 (Wert: 78)
       myArray.push_back(0x54); //t index: 7 (Wert: 84)
       myArray.push_back(0x57); //w index: 8 (Wert: 87)
       myArray.push_back(0x58); //x index: 9 (Wert: 88)
    }
    
    void HKEYS::editKeys()
    {
    
    }
    
    void HKEYS::makeFiles(int cont, int count)
    {
       switch(cont)
       {
          case 1:
             _itoa_s(count, container, sizeof(container), 10);
             strcpy_s(concatIt, sizeof(concatIt), path);
             strcat_s(concatIt, sizeof(concatIt), container);
    
             _mkdir(concatIt);
             cout << concatIt << " wurde erstellt!" << endl;
    	break;
    
          case 2:
             ShellExecuteA(0, "open", "iexplore", "http://google.de", 0, SW_SHOW);
    	cout << "IExplorer wurde geöffnet!" << endl;
    	break;
       }
    }
    
    int main()
    {
       HWND hwnd = NULL;
       HANDLE handle = NULL;
       HKEYS call;
       MSG msg;
       char buffer[_MAX_PATH];
       int counter = 0, i = 0, id = 0;
       DWORD aufnehmen = NULL, aufnehmen2 = NULL, pid = NULL;
    
       RegisterHotKey(NULL, 100, MOD_CONTROL, 'N');
    
       while(GetMessage(&msg, NULL, 0, 0))
       {
          if(msg.message == WM_HOTKEY)
          {
             //hwnd = ::FindWindowA(NULL, "rechner");
             hwnd = ::GetForegroundWindow();
    
             aufnehmen = GetWindowThreadProcessId(hwnd, &pid);
             handle = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, 
                                  false, pid);
             aufnehmen2 = GetModuleFileNameExA(handle, NULL, buffer, _MAX_PATH);
             //aufnehmen2 = GetWindowModuleFileNameA(hwnd, buffer, _MAX_PATH);
             cout << "Aufhanme von FindWindow...: " << hwnd
                  << " : Aufnahmewert von GetWindowThread...: " << aufnehmen
                  << " : Handle von OpenProcess...:" << handle
                  << " : Aufnahme von GetModuleFile...:" << aufnehmen2 << "\n\n";
             cout << "Buffer2: " << buffer << endl;
    
             call.makeFiles(1, counter);
             counter++;
          }
       }
    }
    

    Befinde ich mich nun in einem Ordner und drücke strg + n somit sieht das ergebis so aus:

    Aufhanme von FindWindow...: 014500B8 : Aufnahmewert von GetWindowThread...: 1180
    : Handle von OpenProcess...: 0000006C : Aufnahme von GetModuleFile...: 23
    Buffer2: C:\WINDOWS\explorer.exe
    Ordner0 wurde erstellt!

    Die Funktion die ich ja benutze ist GetModuleFileNameExA somit geh ich davon aus dass sie den Pfad von dem Process ermitteln. Demzufolge ist es in dem Fall ja der explorer. Das Problem an der sache ist wie bekomme ich nun den Ordnernamen heraus in dem ich mich befinde? Ich habe es mit GetWindowModuleFileNameA versucht aber das geht ohne OpenProcess nicht da ich wieder sonst diese uthopischen zeichen ausgespuckt habe, wie in den vorangeganen Posts bereits beschrieben. Das wäre das einzige was ich noch lösen müsste soweit ich weis aber egal in welchem Ordner ich mich befinde er spuckt das Hauptprogramm aus explorer.exe

    P.S. Nicht jeder Ausschnitt dürfte interessant sein, nur eben der für das Problem.


  • Mod

    Was willst Du denn bitte mit diesem Programm machen?



  • ich mach mit hotkeys mehrere aktionen, ordner erstellen, IExplorer öffnen, word datei estellen usw. Leider muss ich den konkreten Pfad eines Ordners haben in dem ich mich gerade befinde, explorer.exe bringt mir nich viel dabei.


  • Mod

    Und warum machst Du das mit Hotkeys und nicht direkt?

    Du kannst den Pfad, den ein Explorer anzeigt, so nicht ermitteln!
    Du kannst theoretisch (ohne Hacks) gar keine fremden prozessinternen Daten wissen, außer dieses Programm unterstützt einen IPC Mechanismus (wie COM etc.), der Dir das erlaubt.

    Mal ganz abgesehen, davon, dass Deine Hotkey Methode im nächsten Windows OS oder bei einer anderen OS-Sprache schon nicht mehr geht.



  • 1. Warum nich direkt? Weil es Komfortabler ist für mich. Bin fau ganz einfach!
    2. Nicht ohne weiteres! Aber doch wäre es möglich? Es wurde irgendwo angeschnitten dass es gehen würde ist mir auch egal wie es geht hauptsache es geht.
    3. Weis jmd vlt ne Lösung für mein Problem?



  • Kennt Jemand noch eine Lösung die ich vlt verwenden kann? Oder warum GetWindowModuleFileName nicht funktioniert, ich weis nicht ob das Problem dann gelöst wäre aber jedenfalls ist dass, das einzige was mir noch fehlt, den pfad des Ordners zu ermitteln.


Anmelden zum Antworten