Показать форму без кражи фокуса?

Переменная, которую вы настроили, не поможет, так как она имеет значение параметра variable-3 URL вашей страницы , но не URL клика . Вам понадобится пользовательская переменная JavaScript для извлечения параметра из того, что доступно как {{CLick URL}}: что-то подобное будет работать для вас:

function () {
  function parse_query_string(query) {
    var vars = query.split("&");
    var query_string = {};
    for (var i = 0; i < vars.length; i++) {
      var pair = vars[i].split("=");
      var key = decodeURIComponent(pair[0]);
      var value = decodeURIComponent(pair[1]);
      // If first entry with this name
      if (typeof query_string[key] === "undefined") {
        query_string[key] = decodeURIComponent(value);
        // If second entry with this name
      } else if (typeof query_string[key] === "string") {
        var arr = [query_string[key], decodeURIComponent(value)];
        query_string[key] = arr;
        // If third or later entry with this name
      } else {
        query_string[key].push(decodeURIComponent(value));
      }
    }
    return query_string;
  }

  return parse_query_string({{Click URL}})['variable-3']
}
134
задан Peter Mortensen 7 December 2013 в 12:35
поделиться

10 ответов

Хм, просто не переопределяет Форму. ShowWithoutActivation достаточно?

protected override bool ShowWithoutActivation
{
  get { return true; }
}

И если Вы не хотите, чтобы пользователь нажал это окно уведомления также, можно переопределить CreateParams:

protected override CreateParams CreateParams
{
  get
  {
    CreateParams baseParams = base.CreateParams;

    const int WS_EX_NOACTIVATE = 0x08000000;
    const int WS_EX_TOOLWINDOW = 0x00000080;
    baseParams.ExStyle |= ( int )( WS_EX_NOACTIVATE | WS_EX_TOOLWINDOW );

    return baseParams;
  }
}
158
ответ дан 23 November 2019 в 23:55
поделиться

Когда Вы создаете новое использование формы

Form f = new Form();
f.ShowDialog();

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

Исключение при помощи поточной обработки для создания новой формы затем Форма. Покажите (). Удостоверьтесь, что поток глобально видим, хотя, потому что, если Вы объявляете это в функции, как только Ваша функция выходит, Ваш поток закончится, и форма исчезнет.

-4
ответ дан 23 November 2019 в 23:55
поделиться

Пример кода из pinvoke.net в ответах Lyman/TheSoftwareJedi's Alex сделает окно "самым верхним" окном, означая, что Вы не можете поместить его позади нормальных окон после того, как это открылось. Учитывая описание Matias того, для чего он хочет использовать это, который мог быть тем, что он хочет. Но если Вы хотите, чтобы пользователь смог поместить Ваше окно позади других окон после того, как Вы раскрылись оно, просто используйте HWND_TOP (0) вместо HWND_TOPMOST (-1) в образце.

9
ответ дан 23 November 2019 в 23:55
поделиться

Выполнение этого походит на взлом, но это, кажется, работает:

this.TopMost = true;  // as a result the form gets thrown to the front
this.TopMost = false; // but we don't actually want our form to always be on top

Править: Отметьте, это просто повышает уже созданную форму, не крадя фокус.

9
ответ дан 23 November 2019 в 23:55
поделиться

Создайте и запустите Форму уведомления в отдельном потоке и сбросьте фокус назад к Вашей основной форме после того, как Форма откроется. Имейте Форму уведомления, обеспечивают событие OnFormOpened, которое запущено из Form.Shown событие. Что-то вроде этого:

private void StartNotfication()
{
  Thread th = new Thread(new ThreadStart(delegate
  {
    NotificationForm frm = new NotificationForm();
    frm.OnFormOpen += NotificationOpened;
    frm.ShowDialog();
  }));
  th.Name = "NotificationForm";
  th.Start();
} 

private void NotificationOpened()
{
   this.Focus(); // Put focus back on the original calling Form
}

Можно также сохранить дескриптор к объекту NotifcationForm вокруг так, чтобы он мог быть программно закрыт основной Формой (frm.Close()).

Некоторые детали отсутствуют, но надо надеяться это получит Вас идущий в правильном направлении.

3
ответ дан 23 November 2019 в 23:55
поделиться

Если Вы готовы использовать Win32 P/Invoke, то можно использовать метод ShowWindow (первый пример кода делает точно, что Вы хотите).

14
ответ дан 23 November 2019 в 23:55
поделиться

Вы могли бы хотеть рассмотреть, какое уведомление требуется отобразить.

Если абсолютно очень важно сообщить пользователю о некотором событии, с помощью Messagebox. Шоу было бы рекомендуемым путем, из-за его характера для блокирования любых других событий к главному окну, пока пользователь не подтверждает это. Знайте о раскрывающейся слепоте, все же.

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

3
ответ дан 23 November 2019 в 23:55
поделиться

Украденный от метода ShowWindow PInvoke.net:

private const int SW_SHOWNOACTIVATE = 4;
private const int HWND_TOPMOST = -1;
private const uint SWP_NOACTIVATE = 0x0010;

[DllImport("user32.dll", EntryPoint = "SetWindowPos")]
static extern bool SetWindowPos(
     int hWnd,             // Window handle
     int hWndInsertAfter,  // Placement-order handle
     int X,                // Horizontal position
     int Y,                // Vertical position
     int cx,               // Width
     int cy,               // Height
     uint uFlags);         // Window positioning flags

[DllImport("user32.dll")]
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

static void ShowInactiveTopmost(Form frm)
{
     ShowWindow(frm.Handle, SW_SHOWNOACTIVATE);
     SetWindowPos(frm.Handle.ToInt32(), HWND_TOPMOST,
     frm.Left, frm.Top, frm.Width, frm.Height,
     SWP_NOACTIVATE);
}

(Alex Lyman ответил на это, я просто разворачиваю его путем прямой вставки кода. Кто-то с правами редактирования может скопировать его там и удалить это для всего, о чем я забочусь ;))

68
ответ дан 23 November 2019 в 23:55
поделиться

Это хорошо работает.

См .: OpenIcon - MSDN и SetForegroundWindow - MSDN

using System.Runtime.InteropServices;

[DllImport("user32.dll")]
static extern bool OpenIcon(IntPtr hWnd);

[DllImport("user32.dll")]
static extern bool SetForegroundWindow(IntPtr hWnd);

public static void ActivateInstance()
{
    IntPtr hWnd = IntPtr hWnd = Process.GetCurrentProcess().MainWindowHandle;

    // Restore the program.
    bool result = OpenIcon(hWnd); 
    // Activate the application.
    result = SetForegroundWindow(hWnd);

    // End the current instance of the application.
    //System.Environment.Exit(0);    
}
2
ответ дан 23 November 2019 в 23:55
поделиться

I know it may sound stupid, but this worked:

this.TopMost = true;
this.TopMost = false;
this.TopMost = true;
this.SendToBack();
0
ответ дан 23 November 2019 в 23:55
поделиться
Другие вопросы по тегам:

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