السحب والإفلات من مستكشف ملفات Windows إلى نموذج Windows لا يعمل

StackOverflow https://stackoverflow.com/questions/281706

سؤال

أواجه مشكلة في سحب ملف من Windows Explorer إلى تطبيق Windows Forms.

إنه يعمل بشكل جيد عندما أقوم بسحب النص ، لكن لسبب ما لا يتعرف على الملف. هنا رمز الاختبار الخاص بي:

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_DragDrop(object sender, DragEventArgs e)
        {

        }

        private void Form1_DragEnter(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent(DataFormats.Text))
            {
                e.Effect = DragDropEffects.Copy;
            }
            else if (e.Data.GetDataPresent(DataFormats.FileDrop))
            {
                e.Effect = DragDropEffects.Copy;
            }
            else
            {
                e.Effect = DragDropEffects.None;
            }
        }
    }
}

يتم تعيين ALTROP على TRUE على Form1 ، وكما ذكرت ، فإنه يعمل إذا قمت بسحب النص إلى النموذج ، وليس فقط ملفًا فعليًا.

أنا أستخدم Vista 64 بت ... لست متأكدًا مما إذا كان هذا جزءًا من المشكلة.

هل كانت مفيدة؟

المحلول

المشكلة تأتي من فيستا UAC. يتم تشغيل DevStudio كمسؤول ، لكن Explorer يعمل كمستخدم منتظم. عندما تقوم بسحب ملف من Explorer وإسقاطه على تطبيق DevStudio المستضاف ، فإن هذا هو نفس المستخدم غير المحدد الذي يحاول التواصل مع مستخدم متميز. هذا غير مسموح.

ربما لن يظهر هذا عند تشغيل التطبيق خارج مصحح الأخطاء. ما لم تقم بتشغيله كمسؤول هناك (أو إذا كان Vista Auto Eleccte هو تطبيق مثبت/إعداد).

هل يمكن أيضا Run Explorer كمسؤول, ، على الأقل للاختبار. أو تعطيل UAC (الذي لا أوصي به ، لأنك تريد حقًا التقاط هذه المشكلات أثناء التطوير ، وليس أثناء النشر!)

نصائح أخرى

الرمز الذي نشرته ينبغي الشغل.

حاول وضع هذا في بداية طريقة Dragenter

string formats = string.Join( "\n", e.Data.GetFormats(false) );
MessageBox.Show( formats );

والتي سوف تفريغ تنسيقات البيانات المرتبطة بعملية d'nd. قد يساعدنا في تضييق المكان الذي تكمن فيه المشكلة.

أضفت الرمز الذي أرول المذكورة وما زالت الأمور لم تنجح ، لكنها جعلتني أفكر.

بدأت أفكر في أنها قد تكون مشكلة فيستا ، لذا فقد أرسلتها إلى صديق كان لديه Windows XP وعمل بشكل رائع! ثم حاولت تشغيله خارج مجلد الإصدار في دليل بن وماذا تعرف أنه نجح!

المرة الوحيدة التي لا تنجح فيها هي عندما أقوم بتشغيله داخل Visual Studio 2008 IDE ... هذا غريب.

هل حاولت إضافة ملف STAThread تنسب إلى الطريقة الرئيسية؟

  [STAThread]
  static void Main(string[] args)
  {
  }

واجهت نفس المشكلة مثل mattruma مما يعني أنني لم أحصل على أحداث السحب والإسقاط. بعد إضافة STAThread تنسب إلى الطريقة الرئيسية التي عملت كما هو متوقع.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top