none
[Résolu] Probleme pour recevoir le message WM_COPYDATA quand il y a une comboBox RRS feed

  • Question

  • J'ai créé un petit exemple qui reproduit bien le problème.

    Pour cela il suffit de :
    - créer un projet WindowsFormsApplication
    - ajouter une comboBox et un bouton avec un event pour le click sur ce bouton
    - remplacer le code de la form par celui fournit

    Ensuite lancer le programme et cliquer sur le bouton sans utilisé la comboBox puis utiliser la comboBox et recliquer sur le bouton.
    On constate que la 1ere fois le message arrive, mais après avoir manipulé la comboBox le message n'est plus reçu.

    Le code de la form :
    using System;
    
    using System.Collections.Generic;
    
    using System.ComponentModel;
    
    using System.Data;
    
    using System.Drawing;
    
    using System.Linq;
    
    using System.Text;
    
    using System.Windows.Forms;
    
    using System.Runtime.InteropServices;
    
    using System.Diagnostics;
    
    
    
    namespace TestSendMessage
    
    {
    
    	public partial class Form1 : Form
    
    	{
    
    		public Form1()
    
    		{
    
    			InitializeComponent();
    
    		}
    
    
    
    		protected override void WndProc(ref Message m)
    
    		{
    
    			if (m.Msg == 0x004A)
    
    			{
    
    				COPYDATASTRUCT cds = (COPYDATASTRUCT)Marshal.PtrToStructure(m.LParam, typeof(COPYDATASTRUCT));
    
    				string sArg = Marshal.PtrToStringAnsi(cds.lpData);
    
    
    
    				MessageBox.Show(sArg);
    
    			}
    
    
    
    			base.WndProc(ref m);
    
    		}
    
    
    
    		private void button1_Click(object sender, EventArgs e)
    
    		{
    
    			//comboBox1.Dispose(); // Si on supprime la comboBox, le message est bien reçu
    
    
    
    			// On prend le process courrant
    
    			Process MyCurrentProcess = Process.GetCurrentProcess();
    
    			EnumWindows(EnumWindowsProc, MyCurrentProcess.Id);
    
    
    
    			MessageBox.Show("Click.", "Test");
    
    		}
    
    
    
    		// Le reste du code recherche le handle de la fenêtre et envoie un message
    
    		public struct COPYDATASTRUCT
    
    		{
    
    			public IntPtr dwData;
    
    			public int cbData;
    
    			public IntPtr lpData;
    
    		};
    
    
    
    		[DllImport("User32.dll")]
    
    		static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);
    
    
    
    		[DllImport("User32.dll")]
    
    		static extern int GetWindowThreadProcessId(IntPtr hWnd, out int ProcessId);
    
    		public delegate int EnumWindowsProcDelegate(IntPtr hWnd, int lParam);
    
    		[DllImport("User32.dll")]
    
    		public static extern int EnumWindows(EnumWindowsProcDelegate EnumWindowsProc, int lParam);
    
    
    
    		public static int EnumWindowsProc(IntPtr hWnd, int lParam)
    
    		{
    
    			int ProcessId;
    
    			int ThreadId = GetWindowThreadProcessId(hWnd, out ProcessId);
    
    			if (lParam != ProcessId)
    
    				return 1;
    
    
    
    			COPYDATASTRUCT cds;
    
    
    
    			string sArg = "Mon Message";
    
    			cds.dwData = IntPtr.Zero;
    
    			cds.cbData = sArg.Length + 1;
    
    			cds.lpData = Marshal.StringToHGlobalAnsi(sArg);
    
    
    
    			IntPtr StructPtr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(COPYDATASTRUCT)));
    
    			Marshal.StructureToPtr(cds, StructPtr, true);
    
    
    
    			// WM_COPYDATA 0x004A
    
    			SendMessage(hWnd, 0x004A, IntPtr.Zero, StructPtr);
    
    
    
    			Marshal.FreeHGlobal(StructPtr);
    
    
    
    			return 0;
    
    		}
    
    	}
    
    }
    
    
    • Modifié Culbutob mercredi 10 juin 2009 07:42 résolu
    mercredi 10 juin 2009 06:59

Réponses

Toutes les réponses