2013-11-20 2 views
4

У меня есть блок кода, как:WinForms эквивалент WPF WindowInteropHelper, HwndSource, HwndSourceHook

IntPtr hWnd = new WindowInteropHelper(this).Handle; 
HwndSource source = HwndSource.FromHwnd(hWnd); 
source.AddHook(new HwndSourceHook(WndProc)); 
NativeMethods.PostMessage((IntPtr)NativeMethods.HWND_BROADCAST, NativeMethods.WM_CALL, IntPtr.Zero, IntPtr.Zero); 

Это было первоначально в приложении WPF. Тем не менее, мне нужно реплицировать функциональность в приложении WinForms. Кроме того, NativeMethods.PostMessage просто карты для USER32.dll PostMessage:

[DllImport("user32")] 
public static extern bool PostMessage(IntPtr hwnd, int msg, IntPtr wparam, IntPtr lparam); 

Есть 1 к 1 экв WindowInteropHelper/HwndSource/HwndSourceHook, что я могу использовать в своих приложениях WinForms?

+1

Просто переопределить метод WndProc(). –

ответ

2

Не больше фона WPF. но для меня это звучит так, будто вы ищете NativeWindow.

4

Основной момент: вам не нужно ничего, кроме AddHook от вашего источника. Каждый WinForm имеет метод GetHandle(), который даст вам дескриптор окна/формы (и вы уже нашли PostMessage).

Too translate AddHook Вы либо пишете свой собственный класс, реализующий IMessageFilter (1), либо переопределяете WndProc() (2).
(1) будет получать сообщения в масштабе всей заявки, независимо от того, в какой форме вы отправляете их, пока (2) получает сообщения только для конкретной формы, переопределяя метод.

Я не мог найти что-либо относительно WM_CALL, так как вам нужно указать оконное сообщение как целое число (обычно в шестнадцатеричном виде), так что это зависит от вас.

(1):

using System; 
using System.Windows.Forms; 
using System.Runtime.InteropServices; 

public partial class Form1 : Form 
{ 
    [DllImport("user32")] 
    public static extern bool PostMessage(IntPtr hwnd, int msg, IntPtr wparam, IntPtr lparam); 

    //private const int WM_xxx = 0x0; 
    //you have to know for which event you wanna register 

    public Form1() 
    { 
     InitializeComponent(); 

     IntPtr hWnd = this.Handle; 
     Application.AddMessageFilter(new MyMessageFilter()); 
     PostMessage(hWnd, WM_xxx, IntPtr.Zero, IntPtr.Zero); 
    }   
} 

class MyMessageFilter : IMessageFilter 
{ 
    //private const int WM_xxx = 0x0; 

    public bool PreFilterMessage(ref Message m) 
    { 
     if (m.Msg == WM_xxx) 
     { 
      //code to handle the message 
     } 
     return false; 
    } 
} 

(2):

using System; 
using System.Windows.Forms; 
using System.Runtime.InteropServices; 

public partial class Form 1 { 
    [DllImport("user32")] 
    public static extern bool PostMessage(IntPtr hwnd, int msg, IntPtr wparam, IntPtr lparam); 

    //private const int WM_xxx = 0x0; 
    //you have to know for which event you wanna register 

    public Form1() 
    { 
     InitializeComponent(); 

     IntPtr hWnd = this.Handle; 
     PostMessage(hWnd, WM_xxx, IntPtr.Zero, IntPtr.Zero); 
    } 

    protected override void WndProc(ref Message m) 
    { 
     if (m.Msg == WMK_xxx) 
     { 
      //code to handle the message 
     } 
    } 
} 
+0

Ваш ответ спас мне столько времени, спасибо! Работал блестяще. – Dan

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