|
Trouver une ressource
Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !
Sujet : Position d'un caret [ Windows / Formulaire / Winforms / Controls ] (ShamSS)
Informations & options pour cette discussion
vendredi 9 janvier 2009 à 14:32:29 |
Position d'un caret

ShamSS
|
Bonjour. je suis en train de developper une petite application d'auto-completion et je n'arrive pas a recuperer la position du caret sur les application exterieur (genre firefox, notepad...) afin de positionner ma petite fenetre de choix a coté de ce caret. Si quelqu'un aurrais une piste pour m'aider ce serais cool. En tout cas, cordialement et merci d'avance.
|
|
|
vendredi 9 janvier 2009 à 14:36:13 |
Re : Position d'un caret

ShamSS
|
Pardon, j'ai oublié d emettre la partie de code qui je pensais me permètrais de recuperer cette coordonée. la voila : Point point = new Point(); Point startPoint = new Point(); bool test = true; test = GetCaretPos(out point); startPoint = PointToScreen(point);
|
|
|
vendredi 9 janvier 2009 à 15:20:52 |
Re : Position d'un caret
|
vendredi 9 janvier 2009 à 15:45:11 |
Re : Position d'un caret

ShamSS
|
Merci Lutinor je vais essayé ça. mais l'utilisation de EM_GETSEL est quand meme assez abstraite pour moi. C'est un type opaque et il y a pas de fonction precise pour l'utiliser mais je vais faire mes recherche merci beaucoups.
|
|
|
vendredi 9 janvier 2009 à 21:54:13 |
Re : Position d'un caret

Bidou
|
Réponse acceptée !
Comme ceci: publicclassProgram { [DllImport("user32.dll", EntryPoint="SendMessage")] publicstaticexternIntPtr SendMessage(IntPtr hWnd, uint Msg, refInt32 start, refInt32 end);
[DllImport("user32.dll", SetLastError=true)] publicstaticexternIntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, String lpszClass, String lpszWindow);
publicconstint EM_GETSEL = 0xB0;
publicstaticvoid Main(string[] args) { IntPtr ptrW = FindWindowEx(IntPtr.Zero, IntPtr.Zero, "WordPadClass", null); if(ptrW != IntPtr.Zero) { IntPtr ptrE = FindWindowEx(ptrW, IntPtr.Zero, "RICHEDIT50W", null); int start = 0, end = 0; SendMessage(ptrE, EM_GETSEL, ref start, ref end); Console.WriteLine("Start {0}, End {1}", start, end); } } }Lutinore> Un truc qui m'est pas clair: je vois tout le temps des déclarations différentes pour SendMessage, (paramètres, type de retour, etc...) comment ça se fait?
- Blog- - Site Perso-
|
|
|
samedi 10 janvier 2009 à 01:52:04 |
Re : Position d'un caret

Lutinore
|
Bidou > dans les déclarations P/Invoke on peut plus ou moins changer les types du moment qu'on respecte leur taille pour ne pas déborder de la pile à l'exécution, il n'y pas de vérification de type effectué puisque le compilo ne connait rien de la fonction non managée.
En général j'essaye de rester le plus fidèle à la déclaration du header C/C++. C'est pas ce que j'ai fait dans le lien de mon exemple précedent et c'est vrai que retourner un bool c'est vilain et ça peut jouer des tours, je sais pas ou j'ai copie/collé cette défintion. ^^
La défintion la plus proche du header ( et la plus sûre ) est celle-ci :
IntPtr SendMessage( IntPtr hWnd, uint Msg, UIntPtr wParam, IntPtr lParam );
|
|
|
samedi 10 janvier 2009 à 13:09:52 |
Re : Position d'un caret

Bidou
|
Ha ok, voilà qui est plus clair.... Mais alors dans le cas où j'envoie EM_GELSEL (comme dans l'exemple plus haut), comment je fais pour récupérer le start et le end avec des IntPtr pour wParam et lParam? J'ai essayé avec Marshal.ToInt mais ça donnait de rien de bien... J'ai fini par passer des ref int et là c'était bon, mais alors je n'utilise plus la "bonne" signature. 
- Blog- - Site Perso-
|
|
|
samedi 10 janvier 2009 à 15:36:23 |
Re : Position d'un caret

Lutinore
|
Tu utilises une bonne signature et à mon avis la plus simple en mode non-unsafe puisque on est sûre que EM_GELSEL renvoie des pointeurs sur des valeurs 32 bits. Les IntPtr ça ne marchait pas car tu as du oublier de les initialiser, ce qui revient à envoyer des pointeurs invalides ou NULL.
en unsafe ça donne ça :
int start = 0; int end = 0; // Unsafe SendMessage( hWnd, EM_GETSEL, ( IntPtr )( &start ), ( IntPtr )( &end ) );
|
|
|
dimanche 11 janvier 2009 à 00:25:15 |
Re : Position d'un caret

Bidou
|
Ok je vois merci pour tes explications. Dernières questions alors ;-) J'ai essayé avec des IntPtr mais j'arrive pas à récupérer les bonnes valeurs : SendMessage(ptrE, EM_GETSEL, ptr1, ptr2); int test = Marshal.ReadInt32(ptr1); // invalid blablabla.... Pourtant j'ai initialisé mes pointeurs (IntPtr) ?!
- Blog- - Site Perso-
|
|
|
dimanche 11 janvier 2009 à 00:48:00 |
Re : Position d'un caret

Lutinore
|
Réponse acceptée !
Les IntPtr doivent être initialisés avec l'adresse des Int32 et comme ça n'a pas bcp de sens en code managé il faut mieux utiliser soit des "ref int" soit du code unsafe comme ça :
[ DllImport( "user32.dll" ) ] private static extern IntPtr SendMessage( IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam ); [ DllImport( "user32.dll", SetLastError = true, CharSet = CharSet.Unicode ) ] private static extern IntPtr FindWindowEx( IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow ); private const int EM_GETSEL = 0xB0;
private unsafe Point GetSelection( ) { IntPtr hWnd = FindWindowEx( IntPtr.Zero, IntPtr.Zero, "WordPadClass", null ); if( hWnd != IntPtr.Zero ) { hWnd = FindWindowEx( hWnd, IntPtr.Zero, "RICHEDIT50W", null ); if ( hWnd != IntPtr.Zero ) { int start = 0; int end = 0; SendMessage( hWnd, EM_GETSEL, ( IntPtr )( &start ), ( IntPtr )( &end ) ); return new Point( start, end ); } } return Point.Empty; }
|
|
|
Cette discussion est classé dans : application, position, caret
Répondre à ce message
Sujets en rapport avec ce message
PB avec les application console [ par Mike ]
Salut, j'ai un probleme avec les application en mode consol ( style fenetre DOS ), lorsque je lance un de ces programmes, il s'arrete automatiquement
Réinitialiser complètement une application Windows [ par jeffwow ]
Ma Form comprend 84 TextBox ( un petit jeu de MasterMind ). Je souhaite pouvoir réinitialiser tous ces TextBox rapidement si le joueur veut recommenc
deploiement application [ par edgarcia ]
Bonjour tlm,Avant que quelqu'un ne fasse la réflexion : oui, je suis une "merde" en développement ASP.NET (et peut être une merde tout court).Newbie .
Petite erreur [ par MorpionMx ]
Voilà, j'ai developpé pour quelqu'un une petite appli, mais le probleme, c'est que quand cette personne veut l'executer, elle a l'erreur "l'applicatio
lancer une application depuis c# [ par cedricp16 ]
tout est dis ! comment puis-je lancer une application depuis csharp ?Merci
Lancer une application en passant un argument [ par pyranea ]
Comment peut on lancer une application qui necessite un argument a l'aide de C# ?Merci d'avance.[;-)]Pyranea
application C# MDI [ par KaiO ]
J'ai une application MDI. Depuis celle ci j'ouvre une Form qui comporte un bouton Quitter. Comment puis-je faire pour que celui-ci ferme l'application
Icon-Erreur [ par mdima ]
J'utilise sharDevelop pour programnmer en c#.Quand j'essaye de changer l'icon de l'application, la compilation se passe bien, mais l'execution du fich
Animation Flash dans les Application Windows [ par Online ]
C'est encore moiVoila, cette fois ci, je voudrais mettre une animation flash sur mon application Wnidows mais je ne vois pas comment faire de facon s
Probleme C# WinXP-Win2000 [ par Miltiades ]
J'ai créé une solution qui contient un ensemble de projets dont un projet de déployement, le tout est compiler sous windows 2000, lorsque je deploie m
Livres en rapport
|
Téléchargements
Logiciels à télécharger sur le même thème :
Comparez les prix Nouvelle version
|