Merci de m'apporter un =E9l=E9ment de r=E9ponse direct ou sous=20
forme de lien.
Cela fait 48 heures que je cherche sur la toile et autres=20
docs et il n'y a RIEN.
Ces digressions sont tir=E9es directement de l'exemple donn=E9=20
avec le VS (2003) que l'on peut trouver en local =E0=20
l'emplacement:
C:\Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1
\Samples\Technologies\Interop\Applications\ShellCmd
1-Interaction avec l'accelerateur clavier Windows+E
Quand le menu est actif, l'accelerateur clavier Windows+E,=20
qui lance Explorer, est d=E9sactiv=E9.
L=E0 o=F9 c'est plus path=E9tique, c'est que si l'application=20
s'enrichit, les int=E9ractions vont de l'affichage=20
intempestif de winforms au plantage d'explorer qui se met=20
=E0 consommer la m=E9moire de fa=E7on affolante.
Question: comment trapper l'accelerateur clavier pour le=20
positionner correctement (lancement d'explorer) ou le=20
desactiver pour =E9viter de planter l'application ?
2-Faire planter l'exemple
Changement au niveau de l'impl=E9mentation de l'interface=20
IContextMenu (ShellExtLib.cs, =E0 la fin):
remplacer:
[PreserveSig()]
int QueryContextMenu(uint hmenu, uint iMenu,=20
int idCmdFirst, int idCmdLast, uint uFlags);
[PreserveSig()]
void InvokeCommand (IntPtr pici);
[PreserveSig()]
void GetCommandString(int idcmd, uint uflags,=20
int reserved, StringBuilder commandstring, int cch);
par:
[PreserveSig()]
void GetCommandString(int idcmd, uint uflags,=20
int reserved, StringBuilder commandstring, int cch);
[PreserveSig()]
void InvokeCommand (IntPtr pici);
[PreserveSig()]
int QueryContextMenu(uint hmenu, uint iMenu,=20
int idCmdFirst, int idCmdLast, uint uFlags);
A partir de l=E0, le menu ne s'affichera plus jamais.
Question: l'ordre des fonctions (signature de l'interface)=20
est-il donc si primordial ?
3-Aller plus loin
Comment impl=E9menter les interfaces IContextMenu2 et=20
IContextMenu3 sans que le menu fasse planter directement=20
explorer ?
Dans mon cas, j'ai r=E9it=E9r=E9 l'impl=E9mentation de=20
IContextmenu par un:
[ComImport(),=20
InterfaceType
(ComInterfaceType.InterfaceIsIUnknown),=20
GuidAttribute("000214f4-0000-0000-c000-
000000000046")]
public interface IContextMenu2
{
// IContextMenu2 method
[PreserveSig()]
int HandleMenuMsg(
uint uMsg, //UINT
IntPtr wParam, //WPARAM=20
IntPtr lParam //LPARAM=20
);
}
[ComImport(),=20
InterfaceType
(ComInterfaceType.InterfaceIsIUnknown),=20
GuidAttribute("bcfce0a0-ec17-11d0-8d10-
00a0c90f2719")]
public interface IContextMenu3
{
// IContextMenu3 method
[PreserveSig()]
int HandleMenuMsg2(
uint uMsg, //UINT
IntPtr wParam, //WPARAM=20
IntPtr lParam, //LPARAM=20
IntPtr plResult //LRESULT *
);
}
J'ai r=E9cup=E9r=E9 les GUIDS sur un site internet. Celui de=20
IContextMenu3 me laisse perplexe.
Qui connait exactement les ShellGUIDS ?
4-Bonus
Pour afficher le message descriptif dans la barre d'=E9tat,=20
qui est invoqu=E9 par le IContextMenu.GetCommandString, le=20
StringBuilder NE MARCHE PAS (j'ai test=E9 longtemps)
J'ai donc utilis=E9 deux fonctions (une pour la partie=20
ASCII, l'autre pour l'UNICODE):
private void pokeAnsiString(IntPtr memPtr,=20
string theString, int sizeMax)
{
int i;
for(i=3D0; i<theString.Length; i++)
{
if(i=3D=3DsizeMax-1)
break;
Marshal.WriteByte(memPtr,=20
i, (byte)theString[i]);
}
Marshal.WriteByte(memPtr, i,=20
0); //0 terminal
}
private void pokeUnicodeString(IntPtr=20
memPtr, string theString, int sizeMax)
{
byte[] bytes;
int i;
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Paul Bacelar
>Question: l'ordre des fonctions (signature de l'interface) est-il donc si primordial ?
Oui, c'est extrêmement important car COM est un standard binaire et si cela vous a échappé, je pense que vous devez commencer par maîtriser les concepts illustrés par votre exemple (que je ne connais pas) avant de commencer à le mettre en vrac.
Si l'exemple n'est pas opérationnel, cela est un autre problème. -- Paul Bacelar Demandeur d'emploi
>Question: l'ordre des fonctions (signature de l'interface)
est-il donc si primordial ?
Oui, c'est extrêmement important car COM est un standard binaire et si cela
vous a échappé, je pense que vous devez commencer par maîtriser les concepts
illustrés par votre exemple (que je ne connais pas) avant de commencer à le
mettre en vrac.
Si l'exemple n'est pas opérationnel, cela est un autre problème.
--
Paul Bacelar
Demandeur d'emploi
>Question: l'ordre des fonctions (signature de l'interface) est-il donc si primordial ?
Oui, c'est extrêmement important car COM est un standard binaire et si cela vous a échappé, je pense que vous devez commencer par maîtriser les concepts illustrés par votre exemple (que je ne connais pas) avant de commencer à le mettre en vrac.
Si l'exemple n'est pas opérationnel, cela est un autre problème. -- Paul Bacelar Demandeur d'emploi
Francis MOREL
Merci pour cette information que je soupçonnais. Cependant, j'ai bien un doute, confirmé par l'exemple donné par le Visual Studio, et que je cite, sur le bon fonctionnement de l'interop dans le cas du shell. Le problème de l'accelerateur clavier Windows+E, l'absence d'information pour les autres interfaces IContextMenu (2 et 3) etc...
Bon, je continue de mon côté, je verrais bien...
Francis MOREL
-----Message d'origine-----
Question: l'ordre des fonctions (signature de
l'interface)
est-il donc si primordial ?
Oui, c'est extrêmement important car COM est un standard
binaire et si cela
vous a échappé, je pense que vous devez commencer par
maîtriser les concepts
illustrés par votre exemple (que je ne connais pas) avant
de commencer à le
mettre en vrac.
Si l'exemple n'est pas opérationnel, cela est un autre
problème.
-- Paul Bacelar Demandeur d'emploi
.
Merci pour cette information que je soupçonnais.
Cependant, j'ai bien un doute, confirmé par l'exemple
donné par le Visual Studio, et que je cite, sur le bon
fonctionnement de l'interop dans le cas du shell.
Le problème de l'accelerateur clavier Windows+E, l'absence
d'information pour les autres interfaces IContextMenu (2
et 3) etc...
Bon, je continue de mon côté, je verrais bien...
Francis MOREL
-----Message d'origine-----
Question: l'ordre des fonctions (signature de
l'interface)
est-il donc si primordial ?
Oui, c'est extrêmement important car COM est un standard
binaire et si cela
vous a échappé, je pense que vous devez commencer par
maîtriser les concepts
illustrés par votre exemple (que je ne connais pas) avant
de commencer à le
mettre en vrac.
Si l'exemple n'est pas opérationnel, cela est un autre
Merci pour cette information que je soupçonnais. Cependant, j'ai bien un doute, confirmé par l'exemple donné par le Visual Studio, et que je cite, sur le bon fonctionnement de l'interop dans le cas du shell. Le problème de l'accelerateur clavier Windows+E, l'absence d'information pour les autres interfaces IContextMenu (2 et 3) etc...
Bon, je continue de mon côté, je verrais bien...
Francis MOREL
-----Message d'origine-----
Question: l'ordre des fonctions (signature de
l'interface)
est-il donc si primordial ?
Oui, c'est extrêmement important car COM est un standard
binaire et si cela
vous a échappé, je pense que vous devez commencer par
maîtriser les concepts
illustrés par votre exemple (que je ne connais pas) avant
de commencer à le
mettre en vrac.
Si l'exemple n'est pas opérationnel, cela est un autre