Я ' м пытаюсь разрешить перетаскивание на значок в трее в моем приложении.
Я знаю, что невозможно сделать это с помощью более высокого уровня C # WindowsForms API, поскольку NotifyIcon
не поддерживает события перетаскивания.
Итак, с небольшой помощью друга, более опытного в Windows, я решил попробовать это через Win32 API. Идея заключалась в том, чтобы зарегистрировать перехватчик в обработчике окна лотка (после установки DragAcceptFiles (hWnd, TRUE);
в обработчике окна "SysPager").
Подвешивающая и отбрасывающая часть работает от лотка к DLL.
LRESULT CALLBACK myHookProc (int code, WPARAM wParam, LPARAM lParam){
if (code == HC_ACTION)
{
PMSG msg = (PMSG) lParam;
switch(msg->message){
case WM_DROPFILES:
::MessageBox(NULL, L"Dropped files!", L"Test", MB_OK);
// call my app's registered hook
break;
}
return CallNextHookEx(oldHookProc, code, wParam, lParam);
}
Как и ожидалось, я получаю всплывающее окно сообщения.
Проблема в том, что теперь мне нужно вызвать функцию в моем приложении C # (WindowsForms), чтобы уведомить об этом событии. Вот где я наткнулся на кирпичную стену.
Когда я регистрирую обратный вызов из моего приложения в DLL, Я храню это; но когда вызывается myHookProc
, его значение равно NULL.
Оказывается, я неправильно понимал, как работают библиотеки DLL; между моим приложением и областью лотка нет общего экземпляра (они скопированы или у каждого есть свой «экземпляр», если можно так назвать), поэтому я не могу использовать какие-либо статические переменные или что-то подобное для хранения обратная ссылка на мое приложение.
Потратил пару часов на изучение этого, и, похоже, единственным решением является общая память (попробовал #pragma data_seg
, с которым я столкнулся на каком-то форуме, но безрезультатно) , но он начинает казаться излишним для такого "простого" варианта использования.
Итак, вопросы на миллион долларов таковы:
Имейте в виду, что это мой первый опыт работы с .NET, C # и Win32 (меньше чем за неделю); Будем очень признательны за подробные ответы, объясняющие, почему - а не просто изложение -!
Спасибо.