Moin Moin....ich benötige etwas Hilfe für folgenden Problem.
Es läuft ein Programm. Dies muß zwingend im Vordergrund laufen, da hier mittels Ipad einige Tastatur-Shortcuts übertragen werden, was nur funktioniert, wenn dies Programm im Vordergrund läuft. Bisher muss ich immer nach extremer Mausklickerei wieder einmal in dies Programmfenster klicken. Dafür habe ich nun eine App gemacht, die dieses Programm intervallmäßig in den Vordergrund holt bzw. den Fokus wieder in dies Programm setzt.
Dies kleine Tool macht einen Check, ob die das zu überwachende Programm läuft und setzt den Focus hierauf. Das ganze über einen
BackgroundWorker.
Das funktioniert jedoch nur auf meinem - Windows 11 - Entwickler Rechner.
Auf fremden PC auch mit W11 oder W7 wird der Focus auf das zu überwachende Programm nur gesetzt, wenn mein Tool selbst (zuvor) im Vordergrund lief. Wenn eine dritte App im Vordergrund läuft, wird das zu überwachende Programm nur in der Taskbar orange blinkend angezeigt, aber nicht mit dem Fokus versehen. Auf meinem W11 Entwicklerrechner geht das aber.
Was mache ich da falsch?
Das zu überwachende Programm läuft im Vollbild auf Bildschirm (2), mein Tool auf Bildschirm (1)
Der Code ist nicht sehr lang....ich poste das mal komplett:
start() aktiviert den
BackgroundWorker -->
bg2_DoWork(...)
FocusProcess(AppName) macht dann die eigentliche Arbeit. Scheinbar steckt hier das Problem.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123:
| using System; using System.Windows.Forms; using System.Runtime.InteropServices; using System.Diagnostics; using System.Drawing; using static System.Windows.Forms.VisualStyles.VisualStyleElement; using System.ComponentModel; using System.Threading;
namespace FocusedControlInOtherProcess { public partial class FormMain : Form { public FormMain() { InitializeComponent(); Start();
} private static string AppName; [DllImport("user32.dll")] internal static extern IntPtr SetForegroundWindow(IntPtr hWnd);
private void Start() { AppName = tBAppName.Text; int fileExtPos = AppName.LastIndexOf("."); if (fileExtPos >= 0) AppName = AppName.Substring(0, fileExtPos); if (tBAppName.Text != "") { labelAppName.ForeColor = Color.Red; labelAppName.Text = AppName; } try { bg2.RunWorkerAsync(); } catch (Exception e) { MessageBox.Show(e.Message); } buttonStart.Enabled = false; } private void bg2_DoWork(object sender, DoWorkEventArgs e) { BackgroundWorker worker = sender as BackgroundWorker; int dfinterval = 3000; int interval = int.TryParse(tBInterval.Text, out dfinterval) ? dfinterval : 1; while (!bg2.CancellationPending) { try { FocusProcess(AppName); } catch (Exception ex) { MessageBox.Show("Error:\n\n" + ex.Message, "System", MessageBoxButtons.OK, MessageBoxIcon.Error); }
Thread.Sleep(interval); } e.Cancel = true; }
private void FocusProcess(string fileName) { AppName = fileName; IntPtr hWnd; Process[] processRunning = Process.GetProcesses(); foreach (Process pr in processRunning) { if (pr.ProcessName == AppName) { hWnd = pr.MainWindowHandle; SetForegroundWindow(hWnd); labelAppName.BeginInvoke(new Action(() => { labelAppName.ForeColor = System.Drawing.Color.Green; ; })); } } } private void buttonStart_Click(object sender, EventArgs e) { Start(); }
private void buttonStop_Click(object sender, EventArgs e) { bg2.CancelAsync(); bg2.Dispose(); labelAppName.ForeColor = Color.Red; buttonStart.Enabled = true; }
private void buttonZoom_Click(object sender, EventArgs e) { if (panel1.Visible == true) infozoom(true); else infozoom(false); }
private void infozoom(bool zoom) { if (zoom == false) { panel1.Visible = true; this.Width = 445; button3.Text = "<<"; } else { panel1.Visible = false; this.Width = 235; button3.Text = ">>"; } } } } |
Moderiert von Th69: C#-Tags hinzugefügt