2015-01-27 3 views
1

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

Это прекрасно работает, но теперь мне нужно, чтобы закрыть форму, форма сама по себе не показывает в Application.OpenForms

Как я могу идти об этом?

Настройка и откройте форму

frmClientCall frm = new frmClientCall {StartPosition = FormStartPosition.Manual, Text = "Phone Call"}; 
frm.Location = new System.Drawing.Point(
    Screen.PrimaryScreen.WorkingArea.Width - frm.Width, 
    Screen.PrimaryScreen.WorkingArea.Height - frm.Height - 202 
); 
frm.lblClient.Text = URI; 
frm.ShowInactiveTopmost(); 

код для предотвращения фокус на форме

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

public void ShowInactiveTopmost() 
{ 
    ShowWindow(Handle, SW_SHOWNOACTIVATE); 
    SetWindowPos(Handle.ToInt32(), HWND_TOPMOST, Left, Top, Width, Height, SWP_NOACTIVATE); 

} 

ответ

4

Да, это не единственная неприятность. Вы, например, можете также увидеть, что событие Load формы никогда не срабатывает. Основная проблема заключается в том, что вы обходите обычную логику, что довольно сложно в Winforms, так как она создает собственное окно лениво. В вашем случае это происходит, когда вы используете свойство Handle. I думаю, Основная проблема заключается в том, что свойство Visible никогда не было установлено true, это тот, который действительно получает мяч.

Ну, не делайте этого, Winforms уже поддерживает показ окна, не активируя его. Вставьте этот код в форму вы хотите отобразить без активации:

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

В SetWindowPos() PInvoke, чтобы сделать его верхний не нужен или, вставьте этот код:

protected override CreateParams CreateParams { 
     get { 
      var cp = base.CreateParams; 
      cp.ExStyle |= 8; // Turn on WS_EX_TOPMOST 
      return cp; 
     } 
    } 
+0

Спасибо за это, тест форма, похоже, сработала, просто нужно проверить форму тоста с помощью реализации телефонной системы, чтобы убедиться, что форма закрывается при запуске события, а затем я буду отмечать как правильный ответ! – Neo

Смежные вопросы