Wie zu verwenden GetForeGroundWindow() auf, um neu gestartete Anwendung Fenster-handle in C#?

Ich versuche zu erfassen, eine neu gestartete Anwendung mit GetForegroundWindow() mithilfe von P/Invoke in C#. Aber alles was ich bekomme ist explorer.exe Fenster-handle anstelle der tatsächlichen Prozess-Fenster-Griff (wie notepad.exe oder wordpad.exe) ins Leben gerufen wurde.

Eigentlich bin ich versucht zu melden Benutzer eingegebenen text wenn der Benutzer öffnet "notepad" gleichzeitig möchte ich, um den eigentlichen Griff aus der "Editor" - Instanz (wenn Sie mehrere Editor-Instanzen offen sind), in dem Benutzer versucht, etwas zu schreiben.

ich.e I starten notepad.exe aus dem Startmenü auf Windows 7 Ultimate x64 mit meiner C#.Net basierte Anwendung für die Tasten gedrückt. Ich habe die setup-Anwendung Schlüssel-Haken in meiner Anwendung so, dass auf text-changed-Ereignis, die Anwendung versucht, um das Vordergrund-Fenster. Das problem ist: Es bekommt explorer.exe statt notepad.exe.

Funktioniert der code auch für bereits-öffnen Sie den windows perfekt, aber es funktioniert nicht für neu gestarteten Instanzen einer Anwendung wie chrome, notepad, wordpad oder einen anderen. Anstelle der Protokollierung der text gegen die korrekte Anwendung protokolliert text für explorer.exe. Hier ist mein code:

    private string GetActiveWindowTitle()
    {
        const int nChars = 256;
        IntPtr handle = IntPtr.Zero;
        StringBuilder Buff = new StringBuilder(nChars);
        handle = GetForegroundWindow();

        if (GetWindowText(handle, Buff, nChars) > 0)
        {
            return Buff.ToString();
        }
        return null;
    }
    Process GetActiveProcess()
    {
        Process[] AllProcess = Process.GetProcesses();
        String title = GetActiveWindowTitle();

        foreach (Process pro in AllProcess)
        {
            if (title.Equals(pro.MainWindowTitle))
            {
                return pro;
            }
        }
        return Process.GetCurrentProcess();
    }

    string GetActiveProcessFileName()
    {
        IntPtr hwnd = GetForegroundWindow();
        SetForegroundWindow(hwnd);
        uint pid;
        GetWindowThreadProcessId(hwnd, out pid);
        Process p = Process.GetProcessById((int)pid);
        //p.MainModule.FileName.Dump();
        return p.ProcessName;
    }

    ProcessInfo GetActiveProcessInfo()
    {
        IntPtr hwnd = GetForegroundWindow();

        const int nChars = 256;
        StringBuilder Buff = new StringBuilder(nChars);
        uint pid;
        GetWindowThreadProcessId(hwnd, out pid);
        Process p = Process.GetProcessById((int)pid);
        ProcessInfo pi = new ProcessInfo();
        if (GetWindowText(hwnd, Buff, nChars) > 0)
        {
            pi.ProcessTitle = Buff.ToString();
        }
        pi.ProcessName = p.ProcessName;
        pi.ProcessHandle = (int)p.MainWindowHandle;

        return pi;
    }

GetActiveProcessInfo gibt explorer.exe anstelle der richtigen Anwendung ich.e notepad.exe da die GetForegroundWindow() Lesen explorer.exe als Vordergrundfenster. Der gleiche code liest die korrekte Anwendung Fenster geben, wenn ich in bestehende Anwendungen zu öffnen und donot starten Sie eine neue Instanz der Anwendung.

Ich habe irgendwo gelesen, dass es eine race-condition problem. wenn dies der Fall ist, wie kann ich dieses Problem lösen?

Bitte helfen Sie mir. Ich bin wirklich fest auf diese sehr lange.

Dank.

Natürlich explorer ist das Vordergrund-Fenster. Es ist, was die Verarbeitung Ihrer Taste drücken, um zu starten den neuen Prozess. Wie Sie es lösen, ich möchte nicht sagen, denn ich kann wirklich nicht verstehen, was Sie versuchen zu erreichen. Aber wenn beim anschließen von Tastatur-Eingaben, kann man das nicht nennen GetForegroundWindow aus in deinem Tastatur-hook und das würde Ihnen sagen, wo die Tastatur-Eingabe zu Ende geht.
Sobald der Editor geöffnet ist, und ich geben Sie "notepad" in der Editor-Fenster, wird der text geändert-Ereignis-logs, text-und später kann ich sehen, dass protokolliert text. Um Dinge zu machen, perfekt, ich update die "Aktuelle Foregound Fenster" im text-changed-Ereignis durch den Aufruf der genannten Methode. Dieses Ereignis sollte sich die aktuelle Vordergrund-Fenster. ich.e die "notepad" - Anwendung, in der ich bin Tippen! Irgendwelche Ideen???

InformationsquelleAutor Steve Johnson | 2012-04-01

Schreibe einen Kommentar