0

有几个来源解释了防止将文件从资源管理器拖放到提升的应用程序的 UAC 事物,但它们都没有涵盖 WPF 示例。

问题是我的应用程序需要以管理员权限运行,但同时它与上述问题发生冲突,所以我陷入了僵局。

作为参考,有这个链接显示如何在 MFC 应用程序中解决这个问题(不是这种情况),使用ChangeWindowMessageFilterAPI。

是否有可能在 WPF 应用程序中实现相同的目标?

- 更新 -

我尝试过的事情:

  1. ChangeWindowMessageFilter在我的主窗口句柄创建后调用。该函数返回真。
  2. ChangeWindowMessageFilterEx在创建主窗口句柄后调用,将其作为参数传递。该函数返回 true 并且CHANGEFILTERSTRUCT.ExtStatusis MSGFLTINFO_NONE
  3. DragAcceptFiles在创建我的主窗口句柄之后调用DragQueryFileDragFinish但是看起来DragAcceptFiles调用不允许WM_DROPFILES在 WndProc 下拖动事件(),如下所示:

.

public partial class MainWindow : Window
{
    protected override void OnSourceInitialized(EventArgs e)
    {
        base.OnSourceInitialized(e);

        var source = PresentationSource.FromVisual(this) as HwndSource;

        source.AddHook(WndProc);

        WinAPI.DragAcceptFiles(new WindowInteropHelper(this).Handle, true);
    }

    private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
    {
        if (msg == WinAPI.WM_DROPFILES)
        {
            // Not reaching here
        }

        return IntPtr.Zero;
    }
}
4

1 回答 1

0
"The problem is that my application NEEDS to be run with administrator rights". 

正确的。问题是,如果 UI 需要提升权限,则您的应用程序设计得不好。UI 应始终在标准用户帐户权限下运行。如果您需要提升权限,请使用 Windows 服务。然后使用 IPC 机制在 UI 和服务之间进行通信,例如命名管道。

于 2021-12-18T13:44:48.893 回答