im essayant de créer un programme dans lequel je peux envoyer un ID de processus d'un processus (qui peut être Firefox, c'est-à-dire un bloc-notes, etc.) à une méthode qui défile la fenêtre du processus.
J'ai essayé avec GetscrollBarinfo et SetScrollpospos que j'ai trouvé à Pinvoke sans aucun succès. Je ne sais pas si c'est la bonne façon ou non. J'ai commencé à jouer avec GetscrollBarinfo, mais cela ne semble pas fonctionner. P>
J'ai essayé le code trouvé à getlastwin32Error () renvoie la code 122 qui signifie "La zone de données transmise à un appel système est trop petite", selon http://msdn.microsoft.com/en-us/library/windows/desktop/ms681382 (v = vs.85) .aspx p> Je ne suis pas sûr de ce que je fais mal. Comment puis-je résoudre ce problème? P> P>
3 Réponses :
Si vous essayez de faire défiler la fenêtre d'un autre processus, vous devez, en vigueur, simuler des clics sur la barre de défilement ou la touche appuie sur la touche. Le moyen le plus propre de faire est d'utiliser Automation UI , qui a les deux Interfaces .NET et Native. P>
En demandant aux informations de la barre de défilement, vous obtenez simplement des informations sur la manière dont la barre de défilement est affichée. Cela ne va pas vous donner un moyen de faire défiler la fenêtre de la fenêtre. Vous devez obtenir l'application cible pour faire défiler le contenu en le faisant penser que l'utilisateur utilise la barre de défilement. P>
Cela ressemble à une façon plus générique de le faire. Va certainement examiner. Merci!! :)
Vous pouvez envoyer un message WM_MouseWheel Wheel pour faire ce que vous voulez. Par exemple, pour faire défiler une fois dans une nouvelle fenêtre de bloc-notes à l'aide de C ++:
//Imports
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
...
//Actual code
IntPtr hwnd = FindWindowEx(FindWindow(null, "Untitled - Notepad"), IntPtr.Zero, "Edit", null);
Point p = new Point(0, 0);
ScrollWindow(hwnd, p);
Merci. Je vais essayer cela plus tard! :)
Trouver des informations à ce sujet semble être un peu difficile. Votre exemple a fonctionné bien au fait. Puisque vous semblez être l'un des rares que j'ai vu qui le sait, où obtenez-vous cette information? J'aimerais généraliser cela plus, alors cela fonctionne sur plus que le bloc-notes. Je ne suis pas sûr d'où vient "Modifier". Qu'est-ce que c'est? Comment puis-je trouver des équivalents pour d'autres programmes?
Le "Edit" est le contrôle du bloc-notes que vous devez envoyer le défilement. De nombreux navigateurs n'exigeront pas qu'il soit envoyé à un contrôle - par exemple, j'ai essayé avec Just Findwindow (NULL, "Nom actuel de la page - Opera"); et le défilement a fonctionné bien. J'ai utilisé WM_MouseWheel dans le passé et je sais ce qui est nécessaire pour le faire en raison de l'utiliser dans un crochet de souris bas niveau. Si vous souhaitez avoir un contrôle qu'il doit être envoyé dans d'autres fenêtres, regardez-vous dans EnumchildWindows ou utilisez simplement Winspy ++. Pour plus d'informations: MSDN.MicRosoft .Com / fr-US / Bibliothèque / Windows / Bureau / ...
De plus, si vous avez besoin de défilement horizontal, le message WM_Mousehwheel devrait fonctionner.
Merci JammerX2. C'est très utile.
Code final P>
class Program
{
[DllImport("user32.dll")]
static extern bool GetGUIThreadInfo(uint idThread, ref GUITHREADINFO lpgui);
[DllImport("user32.dll")]
public static extern int SetScrollPos(IntPtr hWnd, System.Windows.Forms.Orientation nBar, int nPos, bool bRedraw);
[DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);
public struct GUITHREADINFO
{
public int cbSize;
public int flags;
public IntPtr hwndActive;
public IntPtr hwndFocus;
public IntPtr hwndCapture;
public IntPtr hwndMenuOwner;
public IntPtr hwndMoveSize;
public IntPtr hwndCaret;
public System.Drawing.Rectangle rcCaret;
}
const Int32 WM_VSCROLL = 0x0115;
const Int32 SB_LINERIGHT = 1;
static void Main(string[] args)
{
//create process in focus
Process.Start("notepad++", "Source.cpp");
Thread.Sleep(1000);
GUITHREADINFO threadInfo = new GUITHREADINFO();
threadInfo.cbSize = Marshal.SizeOf(threadInfo);
GetGUIThreadInfo(0, ref threadInfo);
SendMessage(threadInfo.hwndFocus, WM_VSCROLL, SB_LINERIGHT, 0);
//SetScrollPos not work. Change only scrollbar without scroll window
//SetScrollPos(threadInfo.hwndFocus, System.Windows.Forms.Orientation.Vertical, 10, true);
}
}