Comment utiliser GetForeGroundWindow() pour obtenir la nouvelle application lancée poignée de fenêtre en C#?

Je suis en train de capturer une nouvelle application lancée à l'aide de GetForegroundWindow() à l'aide de P/Invoke en C#. Cependant, tout ce que j'obtiens est explorer.exe poignée de fenêtre au lieu de la véritable processus de poignée de fenêtre (comme notepad.exe ou wordpad.exe) qui a été lancé.

En fait je suis en train de journal de l'utilisateur saisit du texte lorsque l'utilisateur ouvre le "bloc-notes" dans le même temps, je veux obtenir le véritable poignée de "bloc-notes" de l'instance (si plusieurs bloc-notes instances sont ouvertes) de l'utilisateur qui tente d'écrire quelque chose.

je.e-je lancer notepad.exe à partir du menu démarrer sur Windows 7 Ultimate x64 avec mon C#.Net en fonction de l'application en cours d'exécution pour les touches enfoncées. J'ai le programme d'installation de l'application de la clé de crochets dans mon application, de sorte que sur le texte modifié de l'événement, l'application tente d'obtenir la fenêtre de premier plan. Le problème est: Il obtient explorer.exe au lieu de notepad.exe.

Le code fonctionne pour déjà fenêtres ouvertes parfaitement, mais il ne fonctionne pas pour le nouvellement lancé instances d'une application, tels que le chrome, le bloc-notes, wordpad ou autre. Au lieu de texte de journalisation à l'encontre de l'application correcte, il enregistre le texte pour explorer.exe. Voici mon 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 retourne explorer.exe au lieu de l'application correcte je.e notepad.exe parce que le GetForegroundWindow() lecture explorer.exe en tant que fenêtre de premier plan. Le même code lit l'application correcte de la fenêtre quand je tape dans l'existant les applications ouvertes et de ne pas lancer une nouvelle instance de l'application.

J'ai lu quelque part qu'il existe une race condition de problème. si c'est le cas, comment puis-je résoudre ce problème?

S'il vous plaît aider moi. Je suis vraiment coincé sur cette très longue.

Grâce.

  • Bien sûr explorer est la fenêtre de premier plan. C'est ce qui est le traitement de votre clé appuyez sur pour commencer le processus. Quant à la façon de le résoudre, je ne voudrais pas dire parce que je ne peux pas vraiment comprendre ce que vous essayez d'atteindre. Mais si vous êtes d'accroche de la saisie au clavier, ne pouvez-vous pas appel GetForegroundWindow de l'intérieur de votre clavier crochet et qui vous dira où le clavier d'entrée va finir.
  • Lorsque le bloc-notes est ouvert et j'type "bloc-notes" à l'intérieur de la fenêtre du bloc-notes, le texte modifié de l'événement, les journaux de ce texte et, plus tard, je le vois connecté texte. Pour rendre les choses, parfait, je l'ai mise à jour de l'Actuel "Foregound fenêtre" dans le texte modifié de l'événement par l'appel de ladite méthode. Cet événement doit obtenir l'actuelle fenêtre de premier plan. j'.e le "bloc-notes" de l'application dans laquelle je me suis tapé! Des idées???