Перетаскивание файлов / текста на значок в области уведомлений (C #, WindowsForms)

Я ' м пытаюсь разрешить перетаскивание на значок в трее в моем приложении.

Я знаю, что невозможно сделать это с помощью более высокого уровня 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 , с которым я столкнулся на каком-то форуме, но безрезультатно) , но он начинает казаться излишним для такого "простого" варианта использования.

Итак, вопросы на миллион долларов таковы:

  1. Действительно ли необходимо разгрузить подключение к DLL?
  2. Действительно ли мне нужно использовать разделяемую память для этого?
  3. (Дополнительный вопрос) WM_DROPFILES работает только для файлов; как мне запустить событие перетаскивания для текста?

Имейте в виду, что это мой первый опыт работы с .NET, C # и Win32 (меньше чем за неделю); Будем очень признательны за подробные ответы, объясняющие, почему - а не просто изложение -!

Спасибо.

5
задан Community 23 May 2017 в 12:24
поделиться