В C # у меня есть IntPtr для WIN32 WndProc. Каков синтаксис для его вызова? - PullRequest
2 голосов
/ 14 октября 2008

Я создаю подкласс для собственного окна (элемент управления для редактирования в выпадающем списке ...)

oldWndProc = SetWindowLong (HandleOfCbEditControl, GWL_WNDPROC, newWndProc);

В моем подклассе wndproc у меня будет такой код, верно, но я не могу понять синтаксис для вызова oldWndProc.

    int MyWndProc(int Msg, int wParam, int lParam)
    {
         if (Msg.m ==  something I'm interested in...)
         {
              return something special
         }
         else
         {
              return result of call to oldWndProc  <<<<   What does this look like?***
         }

    }

РЕДАКТИРОВАТЬ: слово «подклассы» в этом вопросе относится к значению API WIN32, а не C #. Подклассы здесь не означают переопределения поведения базового класса .NET. Это означает, что WIN32 должен вызывать указатель вашей функции вместо текущего обратного вызова Windows. Это не имеет ничего общего с наследованием в C #.

Ответы [ 3 ]

2 голосов
/ 14 октября 2008

Вы позвоните CallWindowProc через P / Invoke. Просто определите параметры как переменные типа int (похоже, именно так вы определили их при вызове SetWindowLong), примерно так:

[DllImport ( "CallWindowProc" ...] public static extern int CallWindowProc (int previousProc, int nativeControlHandle, int msg, int lParam, int wParam);

Помните, что для маршалинга int, uint и IntPtr все идентичны.

1 голос
/ 14 октября 2008

Вы должны использовать CallWindowProc для вызова этого указателя oldWndProc.

[DllImport("user32")]
private static extern int CallWindowProc(IntPtr lpPrevWndFunc, IntPtr hWnd, int Msg, int wParam, int lParam);
0 голосов
/ 14 октября 2008

Этот сайт будет очень полезен во всех ваших попытках взаимодействия / p-invoke ( SetWindowLong )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...