簡體   English   中英

C#拖放在Windows 7上不起作用

[英]C# Drag drop does not work on windows 7

我使用C#winforms有一段時間的項目。 我在Windows 7發布之前實現了拖放功能。 工作就像一個魅力。 但是,使用Windows 7時它不起作用。 該事件甚至沒有被觸發。

AllowDrop設置為true。 訂閱DragEnter它不會在Windows 7中調用(不確定vista)。 但是在XP上它一直都有效。 該程序使用administritave priviliges運行。

Windows 7與xp的拖拽有什么不同嗎? 不知道它是否相關,但我使用的是x64

源和目標進程需要具有兼容的安全級別\\權限。 例如,如果您的源是資源管理器並且它以用戶級別權限運行,但您的目標應用程序正在以管理員(提升)級別權限運行,則您將無法拖放,因為這被視為安全問題,因為目標是以更高級別的權限運行。

它被稱為UIPI,用戶界面權限隔離。 旨在防止來自具有受限特權的程序的輸入注入攻擊。 它可以被禁用,你需要這樣做:

  • 修改清單,將<requestedExecutionLevel>元素的uiAccess屬性設置為true。
  • 將程序的EXE存儲在c:\\ windows或c:\\ program files的子目錄中
  • 使用有效代碼簽名授權機構的證書為您的EXE簽名

從來沒有嘗試過這個,ymmv。

它可能是無關的,但我在Windows 8中遇到了拖拽拖拽問題。它會工作一段時間然后停止工作。 我無法在資源管理器,編輯器等之間拖放。事實證明,當我與運行Windows 7的Hyper-V VM進行交互時,我的拖放能力發生了變化(或者可能是ctrl-alt-end鍵擊以模擬crtl-alt-delete到Hyper-V)。 無論如何,一個問題發生了,以下解決了這個問題:

我在這里找到了我的問題的解決方案: 修復拖放功能在Windows 7 Vista XP中不起作用

基本上解決方案是:

左鍵單擊資源管理器中的文件,在按住鼠標按鈕的同時,按[Esc],然后按[Ctrl],然后釋放鼠標按鈕。 我必須假設這是重置一些輔助功能設置或其他東西。

在您的應用程序中,使用以下值調用ChangeWindowMessageFilter,以允許拖放到提升的應用程序和非提升的應用程序(如Explorer):

ChangeWindowMessageFilter (WM_DROPFILES, MSGFLT_ADD);
ChangeWindowMessageFilter (WM_COPYDATA, MSGFLT_ADD);
ChangeWindowMessageFilter (0x0049, MSGFLT_ADD);

dmex的帖子的一個小的補充。 以下定義變量和常量。

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

此外,如果您的應用程序在Windows 7上,您可能需要考慮使用ChangeWindowMessageFilterEx 。我還認為OLE拖放可能不會使用Windows消息傳遞。 所以它根本不會影響。

從VS 2015和Windows 7 x64調試桌面C#應用程序時,我遇到了同樣的問題。這是由於管理員權限應用於桌面上我的VS IDE的快捷方式(見屏幕截圖)。 取消選中此選項拖放事件會正常提升。

感謝TimLloyd的幫助。

在此輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM