public partial class Form1 : Form
{
[DllImport("coredll.dll")]
static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
const int GWL_WNDPROC = -4;
public delegate int WindProc(IntPtr hWnd, uint msg, long Wparam, long lparam);
public Form1()
{
InitializeComponent();
WindProc SampleProc = new WindProc (SubclassWndProc);
SetWindowLong(this .Handle , GWL_WNDPROC,
SampleProc.Method .MethodHandle.Value.ToInt32());
}
public int SubclassWndProc(IntPtr hwnd, uint msg, long Wparam, long lparam)
{
return 1;
}
Вот пример, который я пытался взять оконную процедуру формы, вот как я делаю в С++ я получаю windwproc easlily, если я пытаюсь сделать то же самое в С#.net 3.5, я не могу получить окно proc, после вызова приложения SetWindowLong API зависает, и он всплывает, некоторые не отправляют отчет... Я прочитал, что это способ получить окно proc.. Пожалуйста, дайте мне знать, я делаю ошибку...
SampleProc.Method.MethodHandle.Value.ToInt32()
Просто используйте SampleProc
. Если это не удается, попробуйте выполнить его сортировку с помощью FunctionPointer
.
Экземпляр делегата не обязательно должен быть статичным. Не знаю, почему вы думаете, что это должно быть.
Вы работаете с компактным каркасом, не так ли? Вы делаете все из одного процесса?
Я сам испытал такую проблему, если процесс, в котором создается окно, не является тем же процессом, что и сообщение. Однако я активно использовал SendMessage для отправки сообщения. Если я сделал это из другого процесса, я получил страницу "Отправить сообщение об ошибке". Теперь я выяснил, что если SendMessage происходит из одного и того же процесса, все работает нормально.
В приведенном выше примере вы, вероятно, можете заменить процесс потоком, хотя я не уверен.
Я думаю, вам нужно объявить ваш экземпляр делегата на уровне формы, например:
public partial class Form1 : Form
{
[DllImport("coredll.dll")]
static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
const int GWL_WNDPROC = -4;
public delegate int WindProc(IntPtr hWnd, uint msg,
long Wparam, long lparam);
private WindProc _SampleProc;
public Form1()
{
InitializeComponent();
_SampleProc = new WindProc(SubclassWndProc);
SetWindowLong(this.Handle, GWL_WNDPROC,
_SampleProc.Method.MethodHandle.Value.ToInt32());
}
public int SubclassWndProc(IntPtr hwnd, uint msg,
long Wparam, long lparam)
{
return 1;
}
Оригинальный экземпляр делегата был объявлен в конструкторе формы, где он сразу же вышел из области видимости (и, следовательно, больше не возвращался обратно).
Могут быть и другие проблемы с вашим образцом.