Wenn in einer Windows-Anwendung mehrere Threads verwendet werden, weiß ich, dass es notwendig ist, den Hauptthread aufzurufen, um die GUI-Komponenten zu aktualisieren. Wie wird dies in einer Konsolenanwendung durchgeführt?
Ich habe zum Beispiel zwei Threads, einen Haupt- und einen Nebenthread. Der sekundäre Thread wartet immer auf einen globalen Hotkey; wenn dieser gedrückt wird, führt der sekundäre Thread ein Ereignis aus, das die win32 api-Methode AnimateWindow erreicht. Ich erhalte eine Fehlermeldung, weil nur der Haupt-Thread diese Funktion ausführen darf.
Wie kann ich dem Hauptthread effektiv sagen, dass er diese Methode ausführen soll, wenn "Invoke" nicht verfügbar ist?
aktualisieren: wenn es hilft, hier ist der Code. Um das HotKeyManager-Zeug zu sehen (wo der andere Thread ins Spiel kommt), sehen Sie sich die Antwort auf diese Frage
class 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);
}
}