C# Force Form Focus

前端 未结 8 1921
不思量自难忘°
不思量自难忘° 2020-12-02 14:46

So, I did search google and SO prior to asking this question. Basically I have a DLL that has a form compiled into it. The form will be used to display information to the sc

相关标签:
8条回答
  • 2020-12-02 15:27

    I also had trouble activating and bringing a window to the foreground. Here is the code that eventually worked for me. I'm not sure if it will solve your problem.

    Basically, call ShowWindow() then SetForegroundWindow().

    using System.Diagnostics;
    using System.Runtime.InteropServices;
    
    // Sets the window to be foreground
    [DllImport("User32")]
    private static extern int SetForegroundWindow(IntPtr hwnd);
    
    // Activate or minimize a window
    [DllImportAttribute("User32.DLL")]
    private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
    private const int SW_SHOW = 5;
    private const int SW_MINIMIZE = 6;
    private const int SW_RESTORE = 9;
    
    private void ActivateApplication(string briefAppName)
    {
        Process[] procList = Process.GetProcessesByName(briefAppName);
    
        if (procList.Length > 0)
        {
            ShowWindow(procList[0].MainWindowHandle, SW_RESTORE);
            SetForegroundWindow(procList[0].MainWindowHandle);
        }
    }
    
    0 讨论(0)
  • 2020-12-02 15:27

    Huge thanks people.
    I think I've made it a bit shorter, here's what I put on a seperate thread and seems to be working ok.

    private static void StatusChecking()
    {
        IntPtr iActiveForm = IntPtr.Zero, iCurrentACtiveApp = IntPtr.Zero;
        Int32 iMyProcID = Process.GetCurrentProcess().Id, iCurrentProcID = 0;
        IntPtr iTmp = (IntPtr)1;
    
        while (bIsRunning)
        {
            try
            {
                Thread.Sleep(45);
                if (Form.ActiveForm != null)
                {
                    iActiveForm = Form.ActiveForm.Handle;
                }
                iTmp = GetForegroundWindow();
                if (iTmp == IntPtr.Zero) continue;
                GetWindowThreadProcessId(iTmp, ref iCurrentProcID);
                if (iCurrentProcID == 0)
                {
                    iCurrentProcID = 1;
                    continue;
                }
                if (iCurrentProcID != iMyProcID)
                {
                    SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT, 0, IntPtr.Zero, 0);
                    SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, IntPtr.Zero, SPIF_SENDCHANGE);
                    BringWindowToTop(iActiveForm);
                    SetForegroundWindow(iActiveForm);
                }
                else iActiveForm = iTmp;
            }
            catch (Exception ex)
            {
                Definitions.UnhandledExceptionHandler(ex, 103106);
            }
        }
    }
    

    I don`t bother repasting the definitions...

    0 讨论(0)
提交回复
热议问题