Фокус формы силы C#

Посмотрите на этот пример Plnkr

Переменная this сильно отличается timesCalled с каждым нажатием кнопки увеличивается только на 1. Ответ на мой личный вопрос:

.click( () => { } )

и

.click(function() { })

создают одинаковое количество функции при использовании в цикле, как вы можете видеть из подсчета Guid в Plnkr.

22
задан Yeldar Kurmangaliyev 14 July 2015 в 07:59
поделиться

8 ответов

Я также испытал затруднения при активации и обеспечении окна к переднему плану. Вот код, который в конечном счете работал на меня. Я не уверен, решит ли это Вашу проблему.

В основном, назовите ShowWindow () тогда 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);
    }
}
16
ответ дан Calvin Fisher 29 November 2019 в 04:44
поделиться

Вот некоторый код, который я использовал на одной форме или другом в течение нескольких лет. Существует несколько глюков к тому, чтобы заставлять окно в другом приложении открыться. Как только у Вас есть дескриптор окна, делают это:

      if (IsIconic(hWnd))
        ShowWindowAsync(hWnd, SW_RESTORE);

      ShowWindowAsync(hWnd, SW_SHOW);

      SetForegroundWindow(hWnd);

      // Code from Karl E. Peterson, www.mvps.org/vb/sample.htm
      // Converted to Delphi by Ray Lischner
      // Published in The Delphi Magazine 55, page 16
      // Converted to C# by Kevin Gale
      IntPtr foregroundWindow = GetForegroundWindow();
      IntPtr Dummy = IntPtr.Zero;

      uint foregroundThreadId = GetWindowThreadProcessId(foregroundWindow, Dummy);
      uint thisThreadId       = GetWindowThreadProcessId(hWnd, Dummy);

      if (AttachThreadInput(thisThreadId, foregroundThreadId, true))
      {
        BringWindowToTop(hWnd); // IE 5.5 related hack
        SetForegroundWindow(hWnd);
        AttachThreadInput(thisThreadId, foregroundThreadId, false);
      }

      if (GetForegroundWindow() != hWnd)
      {
        // Code by Daniel P. Stasinski
        // Converted to C# by Kevin Gale
        IntPtr Timeout = IntPtr.Zero;
        SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT, 0, Timeout, 0);
        SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, Dummy, SPIF_SENDCHANGE);
        BringWindowToTop(hWnd); // IE 5.5 related hack
        SetForegroundWindow(hWnd);
        SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, Timeout, SPIF_SENDCHANGE);
      }

я не отправлю целую единицу, так как так как его делает другие вещи, которые не релевантны, но здесь являются константами и импортом для вышеупомянутого кода.

//Win32 API calls necesary to raise an unowned processs main window

[DllImport("user32.dll")]

private static extern bool SetForegroundWindow(IntPtr hWnd);
[DllImport("user32.dll")]
private static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);
[DllImport("user32.dll")]
private static extern bool IsIconic(IntPtr hWnd);
[DllImport("user32.dll", SetLastError = true)]
private static extern bool SystemParametersInfo(uint uiAction, uint uiParam, IntPtr pvParam, uint fWinIni);
[DllImport("user32.dll", SetLastError = true)]
private static extern uint GetWindowThreadProcessId(IntPtr hWnd, IntPtr lpdwProcessId);
[DllImport("user32.dll")]
private static extern IntPtr GetForegroundWindow();
[DllImport("user32.dll")]
private static extern bool AttachThreadInput(uint idAttach, uint idAttachTo, bool fAttach);
[DllImport("user32.dll")]
static extern bool BringWindowToTop(IntPtr hWnd);

[DllImport("user32.dll")] 
private static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, Int32 nMaxCount);
[DllImport("user32.dll")]
private static extern int GetWindowThreadProcessId(IntPtr hWnd, ref Int32 lpdwProcessId);
[DllImport("User32.dll")]
public static extern IntPtr GetParent(IntPtr hWnd); 

private const int SW_HIDE = 0;
private const int SW_SHOWNORMAL = 1;
private const int SW_NORMAL = 1;
private const int SW_SHOWMINIMIZED = 2;
private const int SW_SHOWMAXIMIZED = 3;
private const int SW_MAXIMIZE = 3;
private const int SW_SHOWNOACTIVATE = 4;
private const int SW_SHOW = 5;
private const int SW_MINIMIZE = 6;
private const int SW_SHOWMINNOACTIVE = 7;
private const int SW_SHOWNA = 8;
private const int SW_RESTORE = 9;
private const int SW_SHOWDEFAULT = 10;
private const int SW_MAX = 10;

private const uint SPI_GETFOREGROUNDLOCKTIMEOUT = 0x2000;
private const uint SPI_SETFOREGROUNDLOCKTIMEOUT = 0x2001;
private const int  SPIF_SENDCHANGE = 0x2;
16
ответ дан Stefan Paul Noack 29 November 2019 в 04:44
поделиться

Не ShowDialog () имеют различное поведение окна, чем всего Шоу () ?

, Что, если Вы попробовали:

msgFrm.Show();
msgFrm.BringToFront();
msgFrm.Focus();
3
ответ дан sieben 29 November 2019 в 04:44
поделиться

TopMost = верный;.Activate ()?

Любой из тех польза?

Разделение это в его собственный поток является немного злым как он работа привычки правильно, если Вы не называете его с Приложением. Выполненный и это проглотит поток. В худшем варианте развития событий я предполагаю, что Вы могли выделить его в различный процесс и связаться через диск или WCF.

3
ответ дан Quibblesome 29 November 2019 в 04:44
поделиться

Следующее решение должно отвечать Вашим требованиям:

  1. блок может быть загружен в PowerShell, и основной класс инстанцировал
  2. , Когда метод ShowMessage на этом экземпляре называют, новое окно показывают и активировалось
  3. при вызове ShowMessage многократно это то же окно обновляет свой текст заголовка и активируется
  4. , Чтобы прекратить использовать окно, вызов Располагают метод

Шаг 1 : давайте создадим временный рабочий каталог (можно естественно использовать собственный dir)

(powershell.exe)
mkdir C:\TEMP\PshWindow
cd C:\TEMP\PshWindow

Шаг 2 : Теперь давайте определим класс, что мы будем взаимодействовать с в PowerShell:

// file 'InfoProvider.cs' in C:\TEMP\PshWindow
using System;
using System.Threading;
using System.Windows.Forms;

namespace PshWindow
{
    public sealed class InfoProvider : IDisposable
    {
        public void Dispose()
        {
            GC.SuppressFinalize(this);
            lock (this._sync)
            {
                if (!this._disposed)
                {
                    this._disposed = true;
                    if (null != this._worker)
                    {
                        if (null != this._form)
                        {
                            this._form.Invoke(new Action(() => this._form.Close()));
                        }
                        this._worker.Join();
                        this._form = null;
                        this._worker = null;
                    }
                }
            }
        }

        public void ShowMessage(string msg)
        {
            lock (this._sync)
            {
                // make sure worker is up and running
                if (this._disposed) { throw new ObjectDisposedException("InfoProvider"); }
                if (null == this._worker)
                {
                    this._worker = new Thread(() => (this._form = new MyForm(this._sync)).ShowDialog()) { IsBackground = true };
                    this._worker.Start();
                    while (this._form == null || !this._form.Created)
                    {
                        Monitor.Wait(this._sync);
                    }
                }

                // update the text
                this._form.Invoke(new Action(delegate
                {
                    this._form.Text = msg;
                    this._form.Activate();
                }));
            }
        }

        private bool _disposed;
        private Form _form;
        private Thread _worker;
        private readonly object _sync = new object();
    }
}

, А также Форма, которую покажут:

// file 'MyForm.cs' in C:\TEMP\PshWindow
using System;
using System.Drawing;
using System.Threading;
using System.Windows.Forms;

namespace PshWindow
{
    internal sealed class MyForm : Form
    {
        public MyForm(object sync)
        {
            this._sync = sync;
            this.BackColor = Color.LightGreen;
            this.Width = 200;
            this.Height = 80;
            this.FormBorderStyle = FormBorderStyle.SizableToolWindow;
        }

        protected override void OnShown(EventArgs e)
        {
            base.OnShown(e);
            this.TopMost = true;

            lock (this._sync)
            {
                Monitor.PulseAll(this._sync);
            }
        }

        private readonly object _sync;
    }
}

Шаг 3 : давайте скомпилируем блок...

(powershell.exe)
csc /out:PshWindow.dll /target:library InfoProvider.cs MyForm.cs

Шаг 4 :... и загрузка блок в PowerShell, чтобы весело провести время с ним:

(powershell.exe)
[System.Reflection.Assembly]::LoadFile('C:\TEMP\PshWindow\PshWindow.dll')
$a = New-Object PshWindow.InfoProvider
$a.ShowMessage('Hello, world')

А зеленоватое окно с заголовком 'Привет, мир' должен теперь раскрыться и быть активным. Если Вы повторно активируете окно PowerShell и входите:

$a.ShowMessage('Stack overflow')

заголовок Окна должен измениться на 'Переполнение стека', и окно должно быть активным снова.

, Чтобы прекратить работать с нашим окном, расположите объект:

$a.Dispose()

Это решение работает как ожидалось и в Windows XP SP3, x86 и в Windows Vista SP1, x64. Если существует вопрос о том, как это решение работает, я могу обновить эту запись с детальным обсуждением. На данный момент я надеюсь код, если очевидный.

2
ответ дан Milan Gardian 29 November 2019 в 04:44
поделиться

Вы не должны должны быть импортировать любые функции win32 для этого. Если.Focus () не является достаточно формой, должен также иметь.BringToFront () метод, который можно использовать. Если это перестало работать, можно установить, это-.TopMost свойство к истинному. Вы не хотите к отпуск это верный навсегда, таким образом называете Приложение. DoEvents так форма может обработать то сообщение и задержать его ко лжи.

0
ответ дан Joel Coehoorn 29 November 2019 в 04:44
поделиться

Вы только хотите, чтобы диалоговое окно было ребенком формы вызова?

, Чтобы сделать это Вы будете нуждаться в передаче в окне вызова и использовать ShowDialog (владелец IWin32Window) метод.

0
ответ дан jyoung 29 November 2019 в 04:44
поделиться

Огромное спасибо люди.
Я думаю, что сделал его немного короче, вот то, что я поставил отдельный поток и, кажется, работаю хорошо.

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);
        }
    }
}

Я не потрудился повторно вставлять определения...

1
ответ дан 29 November 2019 в 04:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: