Problème de positionnement de la fenêtre lors de l'utilisation de SetParent()
Je suis en train de définir childForm
comme l'enfant de la principale fenêtre d'Excel à l'aide de la SetParent API par le biais d'PInvoke:
Form childForm = new MyForm();
IntPtr excelHandle = (IntPtr) excelApplication.Hwnd;
SetParent(childForm.Handle, excelHandle);
childForm.StartPosition = FormStartPosition.Manual;
childForm.Left = 0;
childForm.Top = 0;
Comme vous pouvez le voir ci-dessus, mon intention est aussi de la position de l'enfant dans le coin supérieur gauche de la fenêtre Excel. Cependant, pour une raison quelconque, le childForm
finit toujours à un étrange endroit.
Qu'est-ce que je fais de mal?
- Vous êtes un peu en retard à la définition de ces propriétés. Accédant à la propriété Handle est ce qui crée la fenêtre.
Vous devez vous connecter pour publier un commentaire.
Alors que toutes les réponses ici suggèrent parfaitement logique approches, aucun d'entre eux travaillaient pour moi. Ensuite, j'ai essayé de MoveWindow. Pour une raison que je ne comprends pas, il a fait le travail.
Voici le code:
WM_CHILD
et la suppression deWM_POPUP
) sont correctement réglés, comme je l'ai mentionné dans ma réponse précédente, pour éviter des problèmes à l'avenir et de rester cohérent avec la documentation.Lors de l'utilisation de
SetParent
sur un formulaire qui est actuellement un enfant de l'ordinateur de bureau (en d'autres mots, sans un parentset de), vous devez définir la
WS_CHILD
de style et de supprimer lesWS_POPUP
style. (Voir la section "Remarques" de la MSDN entrée.) Windows exige que tous les propriétaires de windowsWS_CHILD
style de jeu. Cela pourrait aussi être à l'origine des propriétés left et top de rapport/jeu de valeurs fausses, car le formulaire ne sait pas qui c'est le papa. Vous pouvez résoudre ce problème en appelantSetWindowLong
aprèsSetParent
, mais avant d'essayer de définir l'emplacement:Cela dépend de votre ShowDialog appelle, je crois. Si vous appelez ShowDialog sans le parent paremeter, le parent est réinitialisé.
Vous pouvez créer un wrapper de la classe qui implémente IWin32Window et retourne le HWND de excel. Ensuite, vous pouvez passer qu'à la ShowDialog appel de childForm.
Vous pouvez également interroger la position de l'application excel en utilisant GetWindowPos et puis définissez la childForm en conséquence.
Essayer quelques choses pour diagnostiquer le problème:
et en Haut, n'en Haut et à Gauche de lecture de zéro?
encore une fois, et la méthode BeginInvoke.
l'enfant. Pour ce faire appel
ShowDialog, et essayez de cliquer sur le
de la fenêtre parent. Assurez-vous que windows
empêche le focus à la fenêtre parent.
En supposant que vous savez comment obtenir le hwnd de la fenêtre, vous souhaitez définir l'ordre-z, vous pouvez utiliser cette pInvoke: