Delegierter im Hauptthread der Konsolenanwendung aufrufen
Wenn in einer Windows-Anwendung mehrere Threads verwendet werden, muss der Haupt-Thread aufgerufen werden, um die GUI-Komponenten zu aktualisieren. Wie erfolgt dies in einer Konsolenanwendung?
Zum Beispiel habe ich zwei Threads, einen Haupt- und einen Nebenthread. Der sekundäre Thread wartet immer auf einen globalen Hotkey. Wenn es gedrückt wird, führt der sekundäre Thread ein Ereignis aus, das die win32-API-Methode AnimateWindow erreicht. Ich erhalte einen Fehler, weil nur der Haupt-Thread diese Funktion ausführen darf.
Wie kann ich den Haupt-Thread effektiv anweisen, diese Methode auszuführen, wenn "Invoke" nicht verfügbar ist?
aktualisieren Wenn es hilft, hier ist der Code. Lesen Sie die Antwort auf @, um die HotKeyManager-Inhalte zu sehen (wo der andere Thread ins Spiel kommtdiese Fragclass Hud
{
bool isHidden = false;
int keyId;
private static IntPtr windowHandle;
public void Init(string[] args)
{
windowHandle = Process.GetCurrentProcess().MainWindowHandle;
SetupHotkey();
InitPowershell(args);
Cleanup();
}
private void Cleanup()
{
HotKeyManager.UnregisterHotKey(keyId);
}
private void SetupHotkey()
{
keyId = HotKeyManager.RegisterHotKey(Keys.Oemtilde, KeyModifiers.Control);
HotKeyManager.HotKeyPressed += new EventHandler<HotKeyEventArgs>(HotKeyManager_HotKeyPressed);
}
void HotKeyManager_HotKeyPressed(object sender, HotKeyEventArgs e)
{
ToggleWindow();
}
private void ToggleWindow()
{
//exception is thrown because a thread other than the one the console was created in is trying to call AnimateWindow
if (isHidden)
{
if (!User32.AnimateWindow(windowHandle, 200, AnimateWindowFlags.AW_VER_NEGATIVE | AnimateWindowFlags.AW_SLIDE))
throw new Win32Exception(Marshal.GetLastWin32Error());
}
else
{
if (!User32.AnimateWindow(windowHandle, 200, AnimateWindowFlags.AW_VER_POSITIVE | AnimateWindowFlags.AW_HIDE))
throw new Win32Exception(Marshal.GetLastWin32Error());
}
isHidden = !isHidden;
}
private void InitPowershell(string[] args)
{
var config = RunspaceConfiguration.Create();
ConsoleShell.Start(config, "", "", args);
}
}