2009-07-26 6 views
3

J'ai une application Windows très simple, avec quelques contrôles, un contrôle DataGridView et le visualiseur Adobe PDF. L'application fonctionne bien, sauf lorsque vous basculez pour basculer entre les contrôles, je reçois régulièrement l'exception suivante.Exception de changement de focus avec la touche de tabulation dans une application .NET

System.AccessViolationException was unhandled 
    Message="Attempted to read or write protected memory. This is often an indication that other memory is corrupt." 
    Source="System.Windows.Forms" 
    StackTrace: 
     at System.Windows.Forms.UnsafeNativeMethods.CallWindowProc(IntPtr wndProc, IntPtr hWnd, Int32 msg, IntPtr wParam, IntPtr lParam) 
     at System.Windows.Forms.NativeWindow.DefWndProc(Message& m) 
     at System.Windows.Forms.Control.DefWndProc(Message& m) 
     at System.Windows.Forms.Control.WndProc(Message& m) 
     at System.Windows.Forms.AxHost.WndProc(Message& m) 
     at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) 
     at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) 
     at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) 
     at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg) 
     at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData) 
     at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context) 
     at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context) 
     at System.Windows.Forms.Application.Run(Form mainForm) 
     at Scan_Manager.Program.Main() in D:\Checkouts\Code\Scan Manager\Scan Manager\Program.cs:line 17 
     at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args) 
     at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) 
     at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
     at System.Threading.ThreadHelper.ThreadStart_Context(Object state) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
     at System.Threading.ThreadHelper.ThreadStart() 
    InnerException: 

Quelqu'un me pointe dans la bonne direction?

Merci, Jon

Mise à jour

Après avoir joué un peu plus, il ne se produit que lorsque le contrôle Adobe perd le focus. Je peux contourner quelque peu en désactivant son Tabstop, mais malheureusement lorsque j'utilise LoadFile pour charger un PDF, il se concentre automatiquement (et l'application se bloque lorsque je tabule)

+0

Est-ce que cela arrive sans le contrôle Adobe? –

+0

Non - et après avoir joué un peu plus, cela ne se produit que lorsque le contrôle Adobe perd le focus. Je peux contourner quelque peu en désactivant son Tabstop, mais malheureusement quand j'utilise LoadFile pour charger un PDF, il obtient automatiquement le focus (et puis l'application se bloque lorsque je tabule). – Jon

+1

Cela ressemble à un bug Adobe. Vous voudrez peut-être leur demander. –

Répondre

3

Cela ne va probablement pas être utile, mais je J'ai seulement vu ces exceptions quand j'étais soit en utilisant un composant COM tiers (comme un Adobe Acrobat Reader) ou quand j'ai fait quelque chose qui nécessite beaucoup de mémoire.

Il s'agit d'une de ces erreurs qui est très difficile à résoudre, et les réponses à cette question ont tendance à varier en fonction de l'origine du problème.

Cela peut être un étirement, mais si vous hébergez Acrobat Reader directement dans votre application, vous pouvez essayer d'afficher le document à l'aide du contrôle WebBrowser et de définir DocumentSource à l'emplacement du fichier PDF. Le contrôle WebBrowser est, je crois (même si je ne suis pas sûr) basé sur Internet Explorer, et il est possible qu'Internet Explorer fasse un meilleur travail d'hébergement de ces contrôles qu'une pure application .Net WinForms. J'ai réussi à montrer d'autres fichiers de cette façon plutôt que d'essayer d'inclure une référence COM tierce. Si cela fonctionne, faites le moi savoir.

+0

L'utilisation du contrôle WebBrowser a en effet corrigé ceci, merci! Il y a des problèmes de focus avec le lecteur Adobe ... mais c'est une autre histoire (et probablement une question). – Jon

1

J'ai rencontré le même problème et j'ai contourné le problème en utilisant PreMessageFilter sur le formulaire ou le contrôle utilisateur. Cela vous permet d'intercepter l'appui sur le bouton d'onglet sur le contrôle Adobe pour éviter que le contrôle lève l'exception. Cela peut ne pas être génial, mais si vous voulez utiliser la visionneuse Adobe PDF que la plupart des utilisateurs ont vu et utilisé auparavant, cela vous permettra de contourner le problème et d'arrêter le plantage de votre application.

Le PreMessageFilter est documenté sur MSDN - http://msdn.microsoft.com/en-us/library/system.windows.forms.application.addmessagefilter(v=vs.110).aspx

J'ai aussi mis en place un exemple VB.Net de ce que vous pouvez télécharger. - http://msdeveloper.co.uk/net/item/102-adobe-viewer-for-winforms

Je serais intéressé de voir si quelqu'un d'autre a rencontré ce problème ou a une autre solution.

Questions connexes