Ja es muss unbedingt ein globaler Hook sein, sonst hätte ich ja nicht gefragt ;-)
Das eine Problem habe ich jetzt gelöst. Die Hook Klasse soll nichts weiter machen als auf eine bestimmte Taste zu hören, und dann ein Event zu feuern. Das habe ich jetzt so gemacht.
Keine Konsolenanwendung sondern eine Form. Form aus der Taskbar entfernt und visible = false gesetzt. Nun in der form den HookManager.KeyDown registriert und auf eine bestimme Taste gehört. Im Falle die Taste wurde gedrückt, dann einfach ein selbst definiertes Event feuern. Soweit so gut.
Jetzt habe ich aber ein anderes Problem. Und zwar wird die Form in einem statischen Konstruktor erzeugt. Die dazugehörige statische Klasse benötigt einfach die Information ob diese Taste gedrückt wurde oder nicht. Wenn ich jetzt aber mit Application.Run(form) die Form starte dann blockiert diese. Daher ich muss dort irgendwie einen neuen Thread bzw. Process starten der die HookForm in einem separaten Process/Thread startet. Leider weis ich nicht wie.
m_HookApplication = new HookApplication();
Application.Run(m_HookApplication);
Das Application.Run(m_HookApplication) muss ich auf einen anderen Thread/Process auslagern. Ich könnte jetzt dort einfach einen anderen Thread starten. Dem Thread einfach die Form übergeben, und dort mit Application.Run(m_HookApplication) die form starten. Die Frage ist ob das praktikabel ist. Was sagt ihr?
Noch eine kleine Frage am Rande dazu. Eine Statische Klasse hat leider keine Destruktur, daher kann ich den Thread nicht sauber beenden. Das heißt der Verwender der statischen Klasse muss selber eine Methode an der statischen Klasse aufrufen um sie korrekt zu beenden. Habt ihr dafür Ideen?