Может кто-нибудь сказать мне, где я делаю ошибку в фрагменте

2
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.. Пожалуйста, дайте мне знать, я делаю ошибку...

Теги:
compact-framework
.net-3.5
windows-mobile

4 ответа

3
Лучший ответ

SampleProc.Method.MethodHandle.Value.ToInt32()

Просто используйте SampleProc. Если это не удается, попробуйте выполнить его сортировку с помощью FunctionPointer.

  • 0
    нет, я не могу дать просто SampleProc, он не будет работать, я понятия не имею о том, чтобы упорядочить его в FunctionPointer .. пожалуйста, скажите мне подробно .. это было бы полезно
  • 0
    Почему это не работает? Пожалуйста, скажите мне. Я использовал многих делегатов в точности как я сказал.
Показать ещё 3 комментария
1

Экземпляр делегата не обязательно должен быть статичным. Не знаю, почему вы думаете, что это должно быть.

0

Вы работаете с компактным каркасом, не так ли? Вы делаете все из одного процесса?

Я сам испытал такую ​​проблему, если процесс, в котором создается окно, не является тем же процессом, что и сообщение. Однако я активно использовал SendMessage для отправки сообщения. Если я сделал это из другого процесса, я получил страницу "Отправить сообщение об ошибке". Теперь я выяснил, что если SendMessage происходит из одного и того же процесса, все работает нормально.

В приведенном выше примере вы, вероятно, можете заменить процесс потоком, хотя я не уверен.

  • 0
    Нет Ответ уже был дан и принят. Он неправильно использовал делегата.
0

Я думаю, вам нужно объявить ваш экземпляр делегата на уровне формы, например:

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

Оригинальный экземпляр делегата был объявлен в конструкторе формы, где он сразу же вышел из области видимости (и, следовательно, больше не возвращался обратно).

Могут быть и другие проблемы с вашим образцом.

  • 0
    В любом случае, делегату потребуется экземпляр. Вы должны объявить экземпляр делегата как статический.
  • 0
    @leppie: Я не думаю, что экземпляр делегата должен быть статическим.
Показать ещё 8 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню