Столкнулся с проблемой... при CommonDialog::ShowDialog() происходит сабклассинг овнера... причем при закрытии коммонДиалога .NET2.0 не вернул предыдущий WNDPROC... Выходит если я до вызова CommonDialog::ShowDialog() обрабатывал мессаги в своей WNDPROC, то после они станут обрабатываться стандартной процеДурой... Хотел решить эту проблему при помощи APIHooking'а... получилось... но не в .NET... в .NET пока положительных результатов не добился... может кто сталкивался с такой проблемой... и как хукать API в .NET которые были импортированы при помощи [DllImport...] заранее благодарю...
Ты бы написал, в чём проблема, может быть, удалось бы эту проблему без мучений решить... С уважением.
Проблема в том, как вовремя узнать, что товарисчи из MS сабклассили окно... причем сделать это нужно из НЕ .NET DLL... Вот, примерно, что происходит в .Net классе CommonDialog: Subclass(owner); //Achtung! CreateCommonDialog(); // название придумал сам... но сути не меняет... ... DestroyCommonDialog(); Unsubclass(); //Achtung! Тут они в SetWindowLong передают не предыдущую процедуру, а DefWindowProc... ... Хотел поймать SetWindowLong… но в .net не получилось...
У класса CommonDialog dctuj-то навсего 8 методов, не считая статического конструктора и обычного конструктора. Судя по всему, речь идёт о методе ShowDialog, верно? Оно? public DialogResult ShowDialog(IWin32Window owner) { IntSecurity.SafeSubWindows.Demand(); if (!SystemInformation.UserInteractive) { throw new InvalidOperationException(SR.GetString("CantShowModalOnNonInteractive")); } if (CommonDialog.helpMsg == 0) { CommonDialog.helpMsg = SafeNativeMethods.RegisterWindowMessage("commdlg_help"); } DialogResult result1 = DialogResult.Cancel; this.ownerSubClass = new CommonDialog.OwnerSublass(this); this.ownerSubClass.Init(owner); using (CommonDialog.OwnerSublass sublass1 = this.ownerSubClass) { Application.BeginModalMessageLoop(); try { return (this.RunDialog(this.ownerSubClass.Handle) ? DialogResult.OK : DialogResult.Cancel); } finally { Application.EndModalMessageLoop(); } } return result1; }
ага.. оно самое... в .net 1.x все также только нет сабкласса... причем, зачем он появился MS похоже сами не знают пока...