WndProc: Как получить оконные сообщения, когда форма свернута - PullRequest
6 голосов
/ 22 июля 2011

Чтобы связаться с определенной службой, я должен переопределить WindProc. и получать оконные сообщения.

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

Ответы [ 3 ]

9 голосов
/ 12 августа 2011

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

class MessageWindow : Form {

  [DllImport("user32.dll")]
  static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

  public MessageWindow() {
     var accessHandle = this.Handle;
  }

  protected override void OnHandleCreated(EventArgs e) {
     base.OnHandleCreated(e);
     ChangeToMessageOnlyWindow();         
  }

  private void ChangeToMessageOnlyWindow() {         
     IntPtr HWND_MESSAGE = new IntPtr(-3);
     SetParent(this.Handle, HWND_MESSAGE);         
  }

  protected override void WndProc(ref Message m) {
     // respond to messages here
  } 
}

Обратите внимание на конструктор: я обнаружил, что мне нужно получить доступ к свойству Handle, иначе метод OnHandleCreated не будет вызван. Не уверен в причине, возможно, кто-то может объяснить, почему.

Я полагаю, что мой пример кода также ответил бы на связанный вопрос: Как мне создать окно только для сообщений из форм Windows?

3 голосов
/ 22 июля 2011

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

Подробнее о теме MSDN .Тем не менее, предупреждение требует, чтобы он немного поигрался с Window API, потому что окно только для сообщений напрямую не поддерживается .NET.

0 голосов
/ 21 апреля 2013

Вы можете попробовать NativeWindow получать сообщения (код VB, извините):

Imports System.Windows.Forms

Public Class MyClass: Inherits NativeWindow

Private piFormHandle As Integer = 0
Sub New()
    Me.CreateHandle(New CreateParams)
    piFormHandle = CInt(Me.Handle)
End Sub

Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
    Select Case (m.Msg)
        Case MyMessage
    End Select
    MyBase.WndProc(m)
End Sub

End Class
...