2010-08-21 207 views
0

每當我想讓用戶拖動一個控件,我調用該控件的DoDragDrop。從另一個線程DoDragDrop()

拖動&降工作正常,但我有乾坤問題:

  1. 的DoDragDrop徹底阻斷的形式,沒有計時器事件猛增,處理沒有油漆的消息。

  2. DoDragDrop阻止不僅爲拖動操作,而且直到目標程序完成拖放事件(I.E. explorer.exe的吸吮代碼)。取決於其他程序的代碼是很爛的。

我想從一個新線程調用DoDragDrop。

嘗試這樣做:

Thread dragThread = new Thread(() => 
{ 
    Form frm = new Form(); 
    frm.DoDragDrop("data", DragDropEffects.All); 
}); 

dragThread.SetApartmentState(ApartmentState.STA); 
dragThread.IsBackground = true; 
dragThread.Start(); 

,但它似乎並不工作。我的意思是:當像這樣從其他線程執行DoDragDrop時,我的程序或其他程序中的其他控件不會收到拖放消息。

其他解決方案?

+0

你怎麼樣提供有關故障的不是「它似乎並沒有一些更多的信息工作」? – Timwi 2010-08-21 16:48:54

+0

當像這樣從其他線程執行DoDragDrop時,我的程序或其他程序中的其他控件不會收到拖放消息。 – DxCK 2010-08-21 16:56:13

回答

1

您需要忘記使用線程,這隻會將D + D通知傳遞到在該線程上創建的窗口。這不會是你的控制。

我不能用「代碼很爛」診斷做很多事情。 DoDragDrop()調用本身將確實阻塞,直到釋放鼠標按鈕。 COM代碼內部的另一個消息循環將接管並傳遞Windows消息。定時器和繪圖消息應該像平常一樣交付。在發佈一些repro代碼之前,診斷非常難。

+0

我懷疑他可能在談論的是,資源管理器在刪除後進入複製操作,並在複製時導致其應用程序UI被阻止。我知道它對WinRAR是這樣做的...... – Timwi 2010-08-21 17:59:49

+2

有一個D + D協議允許應用程序以後期的方式傳輸數據。 .NET程序很難實現,當然不是「數據」。 – 2010-08-21 18:40:42

4

的DoDragDrop方法停止事件的處理,直到第一個鼠標事件(例如鼠標移動)。於是,我找到了解決方法很簡單 - 你只需要只調用的DoDragDrop之前,模擬使用相同的鼠標位置的鼠標事件:


void XYZControl_MouseDown(object sender, MouseEventArgs e) 
{ 
    var senderControl = (Control) sender; 
    ... 
    Cursor.Position = senderControl.PointToScreen(new Point(e.X, e.Y)); // Workaround! 
    if (DoDragDrop(senderControl, DragDropEffects.Move) == DragDropEffects.Move) 
    { 
    ... 
    } 
.... 
}