Pfad irgendeines offnen Fensters ermitteln!



  • Bist Du sicher, daß Du mit UNICODE kompilierst? Deine Fehlerbeschreibungen deuten darauf hin, daß das nicht der Fall ist. Im Code benutzt Du aber WideCharakters.



  • asdca schrieb:

    in der msdn steht zwar nix davon, aber das wär mal meine spontane vermutung 🕶

    Steht in der Knowledge Base:

    GetWindowModuleFileName and GetModuleFileName correctly retrieve information about windows and modules in the calling process. In Windows 95 and 98, they return information about windows and modules in other processes. However, in Windows NT 4.0 and Windows 2000, since module handles are no longer shared by all processes as they were on Windows 95 and 98, these APIs do not return information about windows and modules in other processes.



  • Ich hab da was gelesen von wegen UNICODE aber ich dachte das braucht man nur unter 95/98. ich benutze MS Visual Studio 9.0 un mein Code sieht nun so aus:

    string test;
    DWORD aufnehmen = 0, aufnehmen2 = 0;
    LPDWORD pid = 0;
    TCHAR name[MAX_PATH];
    
    HWND hwnd = ::FindWindow(0, L"Rechner");
    aufnehmen = GetWindowThreadProcessId(hwnd, pid);
    aufnehmen2 = GetModuleFileNameEx(hwnd, NULL, name, MAX_PATH);
    
    for(int i = 0; i < MAX_PATH; i++)
    {
       test += name[i];
    }
    
    cout << "Name: " << test << endl;
    cout << "FindWindow hwnd: " << hwnd << " : GWTProcessID DWORD: " << aufnehmen << " : GMFileNameEx DWORD: "
     << aufnehmen2 << endl;
    

    Die Warnung über möglichen Datenverlust von WCHAR/TCHAR in char ist immernoch gegeben. Die Ausgabe sieht so aus wenn die calc.exe offen ist:

    Name: ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
    ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
    ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
    ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
    FindWindow hwnd: 007D043A : GWTProcessID DWORD: 3956 : GMFileNameEx DWORD: 0

    Wobei sich der handle natürlich ändert un der Prozess DWORD wert auch.



  • Schaut euch bitte erstmal noch das andere Problem an, denn hier habe ich wieder was neues ^^. Ich habe in den Eigenschaften meines Programmes den Zeichensatz (UNICODE war voreingestellt) von UNICODE auf Multi-Byte gesetzt somit musste ich ein paar Änderungen an meinem Code vornehmen:

    string test;
    DWORD aufnehmen = 0, aufnehmen2 = 0;
    LPDWORD pid = 0;
    char name[MAX_PATH];
    
    HWND hwnd = ::FindWindow(0, "Rechner");
    aufnehmen = GetWindowThreadProcessId(hwnd, pid);
    aufnehmen2 = GetModuleFileNameExA(hwnd, NULL, name, MAX_PATH);
    
    for(int i = 0; i < MAX_PATH; i++)
    {
       test += name[i];
    }
    
    cout << "Name: " << test << endl; 
    cout << "FindWindow hwnd: " << hwnd << " : GWTProcessID DWORD: " << aufnehmen << " : GMFileNameEx DWORD: "
         << aufnehmen2 << endl;
    

    Wie ihr sehen könnt sind die L´s weg vor den strings und TCHAR ist nun char und die Warnung mit dem Datenverlust von TCHAR in char ist nun auch weg, also kann es daran nun nicht mehr liegen, es besteht dennoch das gleiche Problem mit der Ausgabe.



  • ich hab doch schon gesagt was das prob ist.



  • achso hast du schon ok



  • deine parameter sind auch völlig falsch, GetModuleFileNameEx erwartet n process handle kein fenster handle



  • hier frickels dir zurecht, mein psdk ist von 1998.

    #include "windows.h"
    
    typedef LPVOID (WINAPI *LPFUNC)();
    
    LPFUNC PSAPICall( LPCSTR lpFunc ) {
    	return (LPFUNC)GetProcAddress(LoadLibrary(L"PSAPI.DLL"),
    		lpFunc);
    }
    
    int main(int argc, char* argv[])
    {
    	DWORD pid = 0;
    	WCHAR name[MAX_PATH];
    	HANDLE h;
    
    	HWND hwnd = FindWindow(0, L"Calculator");
    	GetWindowThreadProcessId(hwnd, &pid);
    	h = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
    	PSAPICall("GetModuleFileNameExW")(h, NULL, name, MAX_PATH);
    
    	MessageBox(NULL, name, L"", 0);
    }
    


  • Hab mein code nun ma ein wenig bearbeitet aber sry ich werd hier noch bekloppt -. - selbst wenn ich deines ausführe (natürlich vorher Veränderungen vorgenommen) Bekomme ich nur Zeichenschrott auf meiner MessageBox ausgespuckt! Und mein Code sieht nun so aus:

    #include <iostream>
    #include <windows.h>
    #include <process.h>
    #include <string>
    #include <psapi.h>
    #pragma comment(lib, "psapi.lib")
    using namespace std;
    
    int main()
    {
       string test = "";
       DWORD aufnehmen = NULL, aufnehmen2 = NULL, pid = NULL;
       char name[MAX_PATH];
       HANDLE handle = NULL;
       HWND hwnd = NULL;
    
       hwnd = FindWindowA(0, "Rechner");
       aufnehmen = GetWindowThreadProcessId(hwnd, &pid);
       handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
       aufnehmen2 = GetModuleFileNameExA(handle, NULL, name, MAX_PATH);
    
       cout << "Aufhanme von FindWindow...: " << hwnd
            << " : Aufnahmewert von GetWindowThread...: " << aufnehmen
            << " : Handle von OpenProcess...:" << handle
            << " : Aufnahme von GetModuleFile...:" << aufnehmen2 << "\n\n";
    
       for(int i = 0; i < MAX_PATH; i++)
       {
          test += name[i];
       }
    
       cout << "Name: " << test << endl 
            << "FindWindow hwnd: " << hwnd
            << " : Process: " << aufnehmen
            << " : Module DWORD: " << aufnehmen2 << endl;
    }
    

    Zeichensatz Multi-Byte, keine Warnungen un das Ergebnis sieht so aus wenn calc.exe offen ist:

    Aufhanme von FindWindow...: 0059026C : Aufnahmewert von GetWindowThread...: 4780
    : Handle von OpenProcess...:00000000 : Aufnahme von GetModuleFile...:0

    Name: ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
    ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
    ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
    ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
    FindWindow hwnd: 0059026C : Process: 4780 : Module DWORD: 0

    Wat mach ich nur Falsch? Mir gehts eigentlich nur noch um die Anzeige des Pfades oder sehe ich da was falsch? Und im Endeffekt geht es mir net nur um die calc.exe es geht mir auch um den Pfad eines offenen Fenster mit GetForegroundWindow(). Nur wenn hier schon Fehler sind dann sind sie dort auch. Was ich im Übrigen schon getestet hatte!



  • 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