GetWindowRect renvoie des valeurs incorrectes sur une application, toutes les autres applications sont correctes

J’utilise GetWindowRect de l’API Windows pour obtenir les limites d’une application en cours d’exécution, puis j’utilise ces limites pour capturer l’application.

Mon code fonctionne pour environ 10 programmes que j’ai testés, notepad.exe et quelques autres, mais l’application que je veux utiliser avec RocLink800 renvoie des valeurs statiques incorrectes quel que soit l’emplacement de l’application.

Le code est C # .NET

[StructLayout(LayoutKind.Sequential)] public struct RECT { public int X; public int Y; public int Width; public int Height; } [DllImport("user32.dll", SetLastError = true)] static extern bool GetWindowRect(IntPtr hWnd, ref RECT Rect); IntPtr error = GetWindowRect(proc.MainWindowHandle, ref rect); ... main code while (error == (IntPtr)0) { error = GetWindowRect(proc.MainWindowHandle, ref rect); } int width = rect.right - rect.left; int height = rect.bottom - rect.top; 

À présent, toutes les applications renvoyant la largeur et la hauteur correctes, roclink800 renvoie une valeur d’erreur de 1 indiquant les succès, mais renvoie les valeurs suivantes, quel que soit l’emplacement de l’application:

rect.right = 960 rect.left = 960 rect.bottom = 600 rect.top = 600

Roclink800 est un ancien programme porté depuis Windows 95 jours, alors peut-être utilise-t-il une certaine API, si tel est le cas, existe-t-il des alternatives à l’API Windows (user32.dll)? ) pour obtenir ses coordonnées d’écran?

Je suppose que je pourrais forcer l’application à aller en plein écran et à la capturer de cette façon, mais c’est moins élégant.

Des idées à qui que ce soit?

edit: Mon code pour obtenir le handle

  Process roclink = new Process(); roclink.StartInfo.FileName = "C:/Program Files (x86)/ROCLINK800/Roclink.exe"; //roclink.StartInfo.FileName = "notepad.exe"; roclink.Start(); IntPtr error = GetWindowRect(roclink.MainWindowHandle, ref rect); 

OU

  try { proc = Process.GetProcessesByName("roclink")[0]; } catch (IndexOutOfRangeException e) { return null; } 

Les deux morceaux de code renvoient le même IntPtr et ils renvoient tous deux 960 960 600 600 si j’appelle

 int error = SetWindowPos(roclink.MainWindowHandle, HWND_TOPMOST, 0, 0, 25,50, SWP_SHOWWINDOW); 

Ensuite, les coordonnées renvoyées sont 0,0,25,50 mais la taille des applications ne change pas.

J’ai essayé de briser le programme, en fermant roclink et SetWindowPos et GetWindowRect retournent tous les deux 0 et ne renvoient pas les fausses valeurs indiquant que le handle est bien le handle correct.

Donc, il semble que cette application ne peut pas avoir sa taille de fenêtre définie ou obtenue via windowsAPI.

 roclink.StartInfo.WindowStyle = ProcessWindowStyle.Maximized; 

Ceci est également ignoré et l’application ne s’ouvrira pas en plein écran, simplement la taille dans laquelle il a été ouvert la dernière fois.

edit: La seule solution que je peux trouver est de faire une copie de roclink.exe et de l’ouvrir manuellement à la main en plein écran, puis de la fermer, à condition que personne d’autre n’ouvre ce fichier, il s’ouvre toujours en plein écran Je n’aime pas ça, mais à moins que quelqu’un ait des idées pourquoi c’est le cas, je devrai peut-être y aller. 🙁

Je pense qu’il est évident que dans le cas de votre application, MainWindowHandle n’est pas la «fenêtre principale» réelle de l’application MainWindowHandle .

En regardant la capture d’écran de cette application RockLink800, il semble qu’il s’agisse d’une application Delphi, et les anciennes versions de Delphi comportaient une fenêtre masquée appelée Application.Handle.

Voici une réponse SO: comment obtenir le handle de la fenêtre principale pour les anciennes applications Delphi:

Récupération des poignées de fenêtre Delphi