[c#] Position en pixel du caret
Bonjour a tous.
Je développe actuellement un application Winform et je souhaite récupérer la position en pixel du caret sur une application tiers (word, firefox, notepad...).
J'ai déjà eut des indications et des parties de code, mais je ne suis pas certain du résultat.
Voici mon code de test sur un projet console en c# :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| class Program
{
#region imporation de dll
[ 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 );
[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern IntPtr GetForegroundWindow();
[DllImport("user32.dll", SetLastError = true)]
public static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);
#endregion
private const int EM_GETSEL = 0xB0;
static unsafe void Main(string[] args)
{
ThreadStart delegue = new ThreadStart (thread);
Thread monThread = new Thread (delegue);
Console.Write("Debut du thread dans 5 secondes.\n");
Thread.Sleep(5000);
monThread.Start();
Console.Read();
}
static unsafe void thread()
{
Process saveProcessCurrent = new Process();
IntPtr idFocus;
//on récupère l'id du handler qui à le processus
while (true)
{
idFocus = GetForegroundWindow();
uint pid;
//on récupère l'id du processus qui possede ce handler
GetWindowThreadProcessId(idFocus, out pid);
Console.WriteLine("IdFocus : " + idFocus + " " + "\nPID : " + pid + "\n");
IntPtr hWnd = (IntPtr)(pid);
if (hWnd != IntPtr.Zero)
{
int start;
int end;
SendMessage(hWnd, EM_GETSEL, (IntPtr)(&start), (IntPtr)(&end));
Console.WriteLine("Point : " + start + " ; " + end + "\n");
}
else
Console.WriteLine(" La fonction GetWindowThreadProcessId(idFocus, out pid) a raté.");
Console.Write("\n /************************************/\n\n");
Thread.Sleep(2000);
}
}
} |
Donc j'ai créé un thread qui récupère le pid du processus courant, qui ensuite lui envoie un message afin de récupérer deux IntPtr, en lieu et place de deux WPARAM pour me les afficher ensuite.
Seulement, les valeurs ref (start et end) me donnent des valeur que je ne peux pas utiliser pour mon application, et qui, ne peuvent pas mettre a jour une instance de type Point.
Ensuite, malgré mes recherches, je n'ai rien trouvé concernant ce type WPARAM, sauf que c'est un type opaque et je ne sais pas ce que cela représente au sein de l'API.
Si quelqu'un a un indice, une solution ou autre chose pour m'aider a résoudre ce problème, je vous en remercie.
Si mes explications ne sont pas assez claires, demandez moi je suis a votre disposition.
Amicalement.