Question

J'ai fait des recherches et je n'ai pas trouvé comment le faire en C #.

Je voulais que cela soit fait pour que je puisse dire à Google Chrome de se lancer dans Suivant , Précédent , Ouvrir un nouvel onglet , Fermer Onglet , Ouvrir une nouvelle fenêtre et Fermer la fenêtre depuis mon application C #.

J'ai fait quelque chose de similaire avec WinAmp en utilisant

[DllImport("user32", EntryPoint = "SendMessageA")]
private static extern int SendMessage(int Hwnd, int wMsg, int wParam, int lParam);

et quelques autres. Mais je ne sais pas quel message envoyer ni comment trouver la fenêtre dans laquelle le transmettre, ou quoi que ce soit.

Alors, quelqu'un pourrait-il me montrer comment envoyer ces 6 commandes à Chrome à partir de C #? merci

EDIT: D'accord, on me fait voter, alors peut-être que je n'étais pas assez clair ou que les gens croient que je n'ai pas essayé de comprendre cela moi-même.

Tout d’abord, je ne suis pas très bon avec tout le matériel de DllImport. J'apprends encore comment cela fonctionne.

J'ai découvert comment faire la même chose dans winamp il y a quelques années et je regardais mon code. Je l'ai fait pour pouvoir sauter une chanson, revenir en arrière, jouer, mettre en pause et arrêter winamp de mon code C #. J'ai commencé par importer:

    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    public static extern IntPtr FindWindow([MarshalAs(UnmanagedType.LPTStr)] string lpClassName, [MarshalAs(UnmanagedType.LPTStr)] string lpWindowName);
    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    static extern int SendMessageA(IntPtr hwnd, int wMsg, int wParam, uint lParam);
    [DllImport("user32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
    public static extern int GetWindowText(IntPtr hwnd, string lpString, int cch);
    [DllImport("user32", EntryPoint = "FindWindowExA")]
    private static extern int FindWindowEx(int hWnd1, int hWnd2, string lpsz1, string lpsz2);
    [DllImport("user32", EntryPoint = "SendMessageA")]
    private static extern int SendMessage(int Hwnd, int wMsg, int wParam, int lParam);

Ensuite, le code que j'ai trouvé pour l'utiliser utilisait ces constantes pour les messages que j'envoyais.

    const int WM_COMMAND = 0x111;
    const int WA_NOTHING = 0;
    const int WA_PREVTRACK = 40044;
    const int WA_PLAY = 40045;
    const int WA_PAUSE = 40046;
    const int WA_STOP = 40047;
    const int WA_NEXTTRACK = 40048;
    const int WA_VOLUMEUP = 40058;
    const int WA_VOLUMEDOWN = 40059;
    const int WINAMP_FFWD5S = 40060;
    const int WINAMP_REW5S = 40061;

Je voudrais obtenir le hwnd (le programme auquel envoyer le message) par:

IntPtr hwnd = FindWindow(m_windowName, null);

alors je voudrais envoyer un message à ce programme:

SendMessageA(hwnd, WM_COMMAND, WA_STOP, WA_NOTHING);

Je suppose que je ferais quelque chose de très similaire à Google Chrome. mais je ne sais pas ce que certaines de ces valeurs devraient être, et j'ai googlé autour pour essayer de trouver la réponse, mais je ne pouvais pas, c'est pourquoi j'ai demandé ici. Ma question est donc comment puis-je obtenir les valeurs pour:

m_windowName et WM_COMMAND

et ensuite, les valeurs des différentes commandes, transmettre , précédent , nouvel onglet , fermer un onglet , nouvelle fenêtre , fermer la fenêtre ?

Était-ce utile?

La solution

Commencez vos recherches sur http://dev.chromium.org/developers

MODIFIER : l'envoi d'un message dans une fenêtre ne représente que la moitié du travail. La fenêtre doit répondre à ce message et agir en conséquence. Si cette fenêtre ne connaît pas un message ou ne s'en soucie pas du tout, vous n'avez aucune chance de le contrôler en envoyant des messages.

Vous examinez le détail de la mise en œuvre de la manière dont vous avez contrôlé Winamp à distance. Envoyer des messages n’est qu’un moyen de le faire et c’est ce que les développeurs de Winamp ont choisi. Les messages que vous utilisez sont des messages définis par l'utilisateur qui ont une signification spécifique uniquement pour Winamp.

La première étape consiste à déterminer si Chromium prend en charge une sorte de contrôle à distance et quels sont ces mécanismes.

Autres conseils

Vous pouvez obtenir facilement le nom de la fenêtre en utilisant Spy ++ de Visual Studio et en appuyant sur CTRL + F, puis en recherchant chrome. Je l'ai essayé et j'ai

" Chrome_VistaFrame " pour la fenêtre dehors. La fenêtre dans laquelle se trouve la page Web est "Chrome_RenderWidgetHostHWND".

Pour ce qui est de WM_COMMAND, vous devrez faire des essais. Vous voudrez évidemment envoyer des clics de bouton (WM_MOUSEDOWN du haut de ma tête). Comme les boutons Précédent et Suivant ne sont pas leurs propres fenêtres, vous devez savoir comment faire cela en simulant un clic de souris à une certaine position x, y afin que Chrome sache ce que vous faites. Vous pouvez également envoyer l’équivalent de raccourci clavier pour revenir en arrière, etc.>.

Un exemple que j'ai écrit il y a quelque temps le fait avec trillian et winamp: envoi de messages vers Windows via c # et winapi

Il existe déjà des outils pour effectuer ce type de macro, en utilisant un langage de script - autoit est celui que j'ai utilisé: autoit.com

Ok, voici ce que j'ai jusqu'ici ... Je sais un peu ce que je dois faire, mais c'est juste une question de le faire maintenant ...

Voici la fenêtre de Spy ++, je me suis verrouillé sur Chrome_RenderWidgetHostHWND et j'ai cliqué sur le bouton Retour de mon clavier. Voici ce que j'ai eu: alt text

Alors voici mes hypothèses, et je joue avec cela depuis toujours, je ne peux tout simplement pas comprendre les valeurs .

IntPtr hWnd = FindWindow("Chrome_RenderWidgetHostHWND", null);
SendMessage(hWnd, WM_KEYDOWN, VK_BROWSER_BACK, 0);
SendMessage(hWnd, WM_KEYUP,   VK_BROWSER_BACK, 0);

Maintenant, je ne sais pas ce que je devrais faire avec les valeurs WM_KEYDOWN / UP ou les valeurs VK_BROWSER_BACK / FORWARD ... J'ai essayé ceci:

const int WM_KEYDOWN = 0x100;
const int WM_KEYUP = 0x101;
const int VK_BROWSER_BACK = 0x6A;
const int VK_BROWSER_FORWARD = 0x69;

Les deux dernières valeurs que j'ai extraites de l'image que je viens de montrer, les codes de balayage pour ces deux clés. Je ne sais pas si je l'ai bien fait cependant. Les deux valeurs précédentes que j'ai obtenues après une recherche sur Google de la valeur WM_KEYDOWN et que quelqu'un a utilisé & H100 et & H101 pour les deux valeurs. J'ai essayé plusieurs autres idées aléatoires que j'ai vues flotter. Je n'arrive pas à comprendre cela.

Oh, et voici la méthode SendMessage

    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, uint lParam);

Ceci est un excellent site pour les constantes interop:

pinvoke

Une autre façon de trouver les valeurs consiste à effectuer une recherche dans koders.com, en utilisant C # comme langue, pour WM_KEYDOWN ou la constante que vous recherchez:

Koders.com

> Les valeurs

& amp; H ressemblent à celles de VB (6). pinvoke et koders renvoient les résultats pour VK_BROWSER_FORWARD,

private const UInt32 WM_KEYDOWN        = 0x0100;
private const UInt32 WM_KEYUP          = 0x0101;

public const ushort VK_BROWSER_BACK = 0xA6;
public const ushort VK_BROWSER_FORWARD = 0xA7;
public const ushort VK_BROWSER_REFRESH = 0xA8;
public const ushort VK_BROWSER_STOP = 0xA9;
public const ushort VK_BROWSER_SEARCH = 0xAA;
public const ushort VK_BROWSER_FAVORITES = 0xAB;
public const ushort VK_BROWSER_HOME = 0xAC;

(Il est amusant de constater combien de fausses définitions de constantes VK flottent, sachant que VK_ * correspond à 1 octet, valeur entre 0 et 255, et que les gens les ont créées)

. "

semble légèrement différent de vos consts. Je pense que la fonction que vous recherchez est SendInput (mais je ne l’ai pas essayée) car c’est une clé virtuelle.

[DllImport("User32.dll")]
private static extern uint SendInput(uint numberOfInputs, [MarshalAs(UnmanagedType.LPArray, SizeConst = 1)] KEYBOARD_INPUT[] input, int structSize);

Explication sur les paramètres:

Paramètres

  • nInputs- Nombre de structures dans le tableau pInputs.
  • pInputs - Pointeur sur un tableau de structures INPUT. Chaque structure représente un événement à insérer dans le flux d'entrée du clavier ou de la souris.
  • cbSize - Spécifie la taille, en octets, d'une structure INPUT. Si cbSize n’est pas la taille d’une structure INPUT, la fonction échoue.

Ceci nécessite un type KEYBOARD_INPUT:

[StructLayout(LayoutKind.Sequential)] 
public struct KEYBOARD_INPUT
{ 
    public uint type; 
    public ushort vk; 
    public ushort scanCode; 
    public uint flags; 
    public uint time; 
    public uint extrainfo; 
    public uint padding1; 
    public uint padding2; 
}

Et enfin un échantillon que je n'ai pas testé pour vérifier s'il fonctionne:

/*
typedef struct tagKEYBDINPUT {
    WORD wVk;
    WORD wScan;
    DWORD dwFlags;
    DWORD time;
    ULONG_PTR dwExtraInfo;
} KEYBDINPUT, *PKEYBDINPUT;
*/
public static void sendKey(int scanCode, bool press)
{
        KEYBOARD_INPUT[] input = new KEYBOARD_INPUT[1];
        input[0] = new KEYBOARD_INPUT();
        input[0].type = INPUT_KEYBOARD;
        input[0].vk = VK_BROWSER_BACK;

    uint result = SendInput(1, input, Marshal.SizeOf(input[0]));
}

Vous devez également activer la fenêtre Chrome à l'aide de SetForegroundWindow

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top