2009-08-11 4 views

Antwort

0

Bevor Sie ein eigenes Anwendungsfenster erstellen, rufen Sie GetForegroundWindow auf. Andernfalls rufen Sie GetWindow (your_hwnd, GW_HWNDNEXT) auf, um das nächste Fenster unterhalb des angegebenen zu finden.

+0

Beachten Sie, dass es einige Situationen, in denen dies nicht, zum Beispiel funktionieren, wenn das vorherige Fenster geschlossen wurde. – JBRWilkinson

1

Ich bin auf der Suche nach dem gleichen - Ich habe eine Anwendung, die auf dem Bildschirm geöffnet bleibt und der Benutzer kann eine Schaltfläche in meiner App aufrufen, sobald sie einen Eintrag in eine der drei Anwendungen von Drittanbietern vorgenommen haben.

Wenn sie auf die Schaltfläche in meiner App klicken, muss ich feststellen, welche der drei Anwendungen sie zuletzt verwendet haben, um zu wissen, mit welcher Datenbank sie sprechen. Ich habe den Weg der Betrachtung von GetForeGroundWindow und GetWindow gegangen, aber der Window-Handle, den ich von GetWindow bekomme, verweist immer auf ein Fenster mit Titel M. Ich habe das Winternal Explorer-Tool aus den Managed Windows-API-Tools verwendet und kann das M-Handle finden zurückgegeben und es ist ein "Kind" des Prozesses, nach dem ich bin - aber von diesem Handle kann ich den Prozessnamen nicht bekommen.

Ich habe ein kleines Beispiel-App mit einfachen Windows-Formen gemacht - und ich laue es und dann machen Editor den Fokus und klicken Sie dann auf meine Schaltfläche und ich bekomme den Griff - aber beim Blick auf den MainWindowHandle aller Prozesse, Es ist nicht aufgeführt, aber mit Winternal Explorer kann ich sehen, dass dies ein Unterprozess des Notepad-Prozesses ist.

Irgendwelche Vorschläge, warum ich nur dieses Subprozesshandle anstelle des eigentlichen Prozesshandles bekomme ??

Beispielcode ist unten - auf einem 3-Maschine sp XP Windows ausgeführt wird

using System; 
using System.Runtime.InteropServices; 
using System.Windows.Forms; 

namespace TestWindowsAPI 
{ 
    public partial class Form1 : Form 
    { 
     [DllImport("user32.dll")] 
     public static extern IntPtr GetForegroundWindow(); 

     [DllImport("user32.dll", SetLastError = true)] 
     static extern IntPtr GetWindow(IntPtr hWnd, uint uCmd); 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      IntPtr thisWindow = GetForegroundWindow(); 
      IntPtr lastWindow = GetWindow(thisWindow, 2); 

      tbThisWindow.Text = thisWindow.ToString(); 
      tbLastWindow.Text = lastWindow.ToString(); 
     } 
    } 
} 
+0

Wenn Sie einen WIN32-Windows-Hook verwendet haben, könnten Sie Ihren Code automatisch aufrufen lassen, wenn Sie einen Vorgang innerhalb der Drittanbieteranwendung ausführen. In diesem Artikel finden Sie weitere Informationen: http://support.microsoft.com/kb/318804 – JBRWilkinson

Verwandte Themen