Включить перетаскивание из проводника в приложение Run-As-Administrator - PullRequest
3 голосов
/ 25 сентября 2010

Я создал приложение winforms и реализовал функцию перетаскивания.эта функциональность прекрасно работает в WinXP или в Win7 из приложений Run-As-Administrator.

Проблемы возникают при попытке перетаскивания из приложения без прав администратора в Win7 в мою программу, просто не работает.

Я так понимаю, потому что ОС фильтрует сообщения.Я нашел решение для этого здесь: http://blog.helgeklein.com/2010/03/how-to-enable-drag-and-drop-for.html, но, похоже, оно не работает.

вот код обходного пути:

    [DllImport("user32.dll", SetLastError = true)]
    static extern bool ChangeWindowMessageFilter(uint message, uint dwFlag);

    private const uint WM_DROPFILES = 0x233;
    private const uint WM_COPYDATA = 0x004A;
    private const uint WM_COPYGLOBALDATA = 0x0049;
    private const uint MSGFLT_ADD = 1;

    ChangeWindowMessageFilter(WM_DROPFILES, MSGFLT_ADD);
    ChangeWindowMessageFilter(WM_COPYDATA, MSGFLT_ADD);
    ChangeWindowMessageFilter(WM_COPYGLOBALDATA, MSGFLT_ADD);

Как заставить это работать?

1 Ответ

7 голосов
/ 25 сентября 2010

Да, вы боретесь с UIPI, аспектом UAC, который не позволяет несвободным программам захватывать ресурсы повышенного уровня. И да, ChangeWindowMessageFilter () позволяет обойти это ограничение для сообщений Windows.

Однако OLE drag and drop не использует сообщения Windows. Он использует обратные вызовы, подробности смотрите в документации на RegisterDragDrop (). В этом сообщении в блоге microsoftie говорится, что вы облажались, хотя это и открывает дверь для CWMF. Как получить сообщение WM_DROPFILES, однако, совершенно неясно для меня. Использование DragAcceptFiles () в примере приложения Windows Forms не оказало заметного эффекта.

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