天天看點

Win7下的DragDrop事件不觸發?

  Win7與原來的XP和Win2003相比,安全控制方面更嚴格。比如,當我們以administrator登陸XP或Win2003時,運作所有的程式即是以管理者的身份啟動的。但當以administrator登陸Win7時,通常狀态下,運作普通程式是以普通使用者的身份啟動的。當我們的WinForm應用程式需要以管理者的身份運作時(比如,為了通路windows系統資料庫),我們需要在程式清單(app.manifest檔案)中将UAC選項改為"requireAdministrator"(可以參考如何自動以管理者身份運作.NET程式?)。如此生成的exe的圖示在XP和Win2003下是沒有變化的,但是放到win7下面,你會發現圖示的右下角多了一個小盾牌,如下圖:

  

Win7下的DragDrop事件不觸發?

  如果同時你的應用程式需要從windows資料總管拖動檔案到你的WinForm上,你會發現原本在XP和Win2003下運作很正常的程式,結果到了win7下就不支援拖拽了,DragEnter/DragOver/DragDrop等事件統統都不被觸發。

  是什麼原因導緻這個問題了?

  這是因為windows規定:當拖放源與目标運作的安全級别(隔離級别)不一緻時,是禁止拖放的。即,我們的windows資料總管是以普通使用者的身份運作的,而此時我們的應用程式是以管理者身份運作的,兩個安全級别不一樣,是以不能拖放了。而在XP和Win2003,我們本來就是以管理者登陸的,資料總管和我們的應用程式都是以管理者身份運作的,是以拖放就是正常工作的。

  如何解決Win7下這個拖拽的問題了?

(1)方法一,修改你的應用程式,使之能以普通使用者的身份正常運作;

(2)方法二,調整程式結構,把界面部分做成普通權限啟動,背景再做一個服務來運作高安全性的操作,兩者可以通過類似Remoting的技術來通信。

(3)方法三,修改Windows的MessageFilter,像下面這樣:

 [DllImport( " user32.dll " , SetLastError  =   true )]

 static   extern  IntPtr ChangeWindowMessageFilter( uint  message,  uint  dwFlag);

  uint  WM_DROPFILES  =   0x0233 ;

  uint  WM_COPYDATA  =   0x4A ;

  uint  MSGFLT_ADD  =   1 ;

 ChangeWindowMessageFilter(WM_DROPFILES, MSGFLT_ADD);

 ChangeWindowMessageFilter(WM_COPYDATA, MSGFLT_ADD);

 ChangeWindowMessageFilter( 0x0049 , MSGFLT_ADD);    

   

  如果有更好的方法,請留言。

  

繼續閱讀