Question

Je développe une application en utilisant C # ayant des fonctionnalités similaires de copie, collez comme dans Windows. J'ai ajouté des éléments de menu et lié avec des applications respectives.

Veuillez consulter l'image suivante pour avoir plus d'idée.

Éléments ajoutés au menu Shell http://softwaregegenius.net/myimages/menu.jpg

Comme nous sélectionnons plusieurs éléments dans Windows Explorer, vous devez sélectionner plusieurs fichiers et / ou dossiers, puis sélectionner OS Util-> FastCopy. Un formulaire est ouvert comme indiqué ci-dessous

Formulaire indiqué sur fastcopy http://softwaregenius.net/myimages/fastcopy1.jpg

L'application fonctionne parfaitement. Le problème majeur ici est qu'après avoir sélectionné les fichiers, tous ces fichiers s'ouvrent dans les logiciels respectifs. C'est-à-dire si j'ai sélectionné Word Document, le nom de fichier est ajouté au formulaire FastCopy, mais l'on s'ouvre également dans Word également.

Lorsque j'enquête, j'ai constaté que ce problème est dû à SendMessage. Je dois utiliser PostMessage au lieu de SendMessage. Mais quand je le fais, l'application ne fonctionne pas.

Vous trouverez ci-dessous mon codage de fonction principale en C # 2005

static class Program
{
    static Mutex mutex = new Mutex(true, "{8F6F0AC4-B9A1-45fd-A8CF-72F04E6BDE92}");
    [STAThread]
    static void Main(string[] args)
    {
        string fileName = "";
        if (args.Length > 0)
        {
            fileName = args[0];
        }
        if (mutex.WaitOne(TimeSpan.Zero, true))
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            frmFastCopy frm = new frmFastCopy();
            frm.AddItemToList(fileName);
            Application.Run(frm);

        }
        else
        {
            //The following message is sent just to show up the form
            NativeMethods.PostMessage(
                    (IntPtr)NativeMethods.HWND_BROADCAST,
                    NativeMethods.WM_SHOWME,
                    IntPtr.Zero,
                    IntPtr.Zero);

            //Send the filename
            SendFileName(fileName);
        }
    }

    static void SendFileName(string s)
    {
        Win32.CopyDataStruct cds = new Win32.CopyDataStruct();

        cds.cbData = (s.Length + 1) * 2;
        cds.lpData = Win32.LocalAlloc(0x40, cds.cbData);
        Marshal.Copy(s.ToCharArray(), 0, cds.lpData, s.Length);
        cds.dwData = (IntPtr)1;
        Win32.SendMessage((IntPtr)NativeMethods.HWND_BROADCAST, Win32.WM_COPYDATA, IntPtr.Zero, ref cds);
        //NativeMethods.PostMessage((IntPtr)NativeMethods.HWND_BROADCAST, Win32.WM_COPYDATA, cds.lpData, IntPtr.Zero);
    }
}

}


Vous trouverez ci-dessous la copie de WNDProc et d'autres code à partir du formulaire

Classe partielle publique frmfastCopy: form {Delegate void addItemTolistDelegate (String itm);

    public frmFastCopy()
    {
        InitializeComponent();
    }

    public void AddItemToList(string itm)
    {
        if (lvFilesAndFolders.InvokeRequired)
        {
            AddItemToListDelegate m = new AddItemToListDelegate(AddItemToList);
            this.Invoke(m, new object[] { itm });
        }
        else
        {
            lvFilesAndFolders.Items.Add(itm);
        }
    }
    protected override void WndProc(ref Message m)
    {
        if (m.Msg==NativeMethods.WM_SHOWME)
        {
                ShowMe();
        }
        if (m.Msg==Win32.WM_COPYDATA)
        {
                //string s = Marshal.PtrToStringUni(m.LParam);
                MessageBox.Show("Got message");

                Win32.CopyDataStruct st = (Win32.CopyDataStruct)Marshal.PtrToStructure(m.LParam, typeof(Win32.CopyDataStruct));
                string strData = Marshal.PtrToStringUni(st.lpData);
                AddItemToList(strData);
        }
        base.WndProc(ref m);
    }
    private void ShowMe()
    {
        this.Show();
        if (WindowState == FormWindowState.Minimized)
        {
            WindowState = FormWindowState.Normal;
        }
        // get our current "TopMost" value (ours will always be false though)
        bool top = TopMost;
        // make our form jump to the top of everything
        TopMost = true;
        // set it back to whatever it was
        TopMost = top;
    }

Voici la classe nativecode

internal class NativeMethods
{
    public const int HWND_BROADCAST = 0xffff;
    public static readonly int WM_SHOWME = RegisterWindowMessage("WM_SHOWME");
    [DllImport("user32")]
    public static extern bool PostMessage(IntPtr hwnd, int msg, IntPtr wparam, IntPtr lparam);
    [DllImport("user32")]
    public static extern int RegisterWindowMessage(string message);

}

Je sais que vous êtes un génie. Quelqu'un pourrait-il me dire où devrais-je apporter des modifications aux fichiers sélectionnés devraient être ouverts, ou plutôt comment je dois utiliser le postmessage.

Merci d'avoir partagé votre temps précieux.

Salutations

Irfan

Était-ce utile?

La solution

Veuillez regarder mon commentaire (je me demande pourquoi vous n'utilisez pas le cours de presse-papiers ici). Mais ignorer cela: pourquoi diffusez-vous le message?

Pouvez-vous localiser votre application (par nom, classe de fenêtres, peu importe) et envoyer uniquement le message à votre propre application?


Pour développer le traitement du message: vous dites concernant HWND_BROADCAST dans les commentaires ci-dessous:

Ce n'est que la poignée globale de mon application.

Non ce n'est pas. C'est une valeur spéciale qui indique à Windows "Ce message est pour toutes les applications". Vous envoyez un WM_SHOWME à tout applications. C'est pourquoi j'ai demandé pourquoi vous voudriez faire cela?

Veuillez consulter ce message sur The Old New Things Blog concernant les émissions de messages.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top