2010-09-23 28 views
6

J'ai un programme qui doit envoyer le message BM_CLICK à un autre bouton d'applications. Je peux obtenir la poignée de fenêtre parente mais lorsque je tente d'obtenir la poignée de bouton si retourne toujours 0Obtention d'un handle de bouton à partir d'une autre application

je suis arrivé sur le bouton nom de la légende et le type de bouton de Spy ++ il semble juste, mais je sais que je dois avoir obtenu quelque chose de mal. ci-dessous est mon code

public const Int BM_CLICK = 0x00F5; 

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
     private static extern IntPtr SendMessage(IntPtr hwnd, uint Msg, IntPtr wParam, IntPtr lParam); 

     [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
     static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow); 



private void button1_Click(object sender, EventArgs e) 
{ 
    Process[] processes = Process.GetProcessesByName("QSXer"); 

    foreach (Process p in processes) 
    { 
     ////the Button's Caption is "Send" and it is a "Button". 
     IntPtr ButtonHandle = FindWindowEx(p.MainWindowHandle, IntPtr.Zero, "Button", "Send"); 
     //ButtonHandle is always zero thats where I think the problem is 
    SendMessage(ButtonHandle, BM_CLICK, IntPtr.Zero, IntPtr.Zero); 

    } 

} 

écran Spy tourné

alt text

Répondre

5

Essayez de passer null pour le texte de la fenêtre et essayez plutôt de trouver un bouton:

IntPtr ButtonHandle = FindWindowEx(p.MainWindowHandle, IntPtr.Zero, "Button", null); 

Après cela, vous pouvez utilisez le deuxième paramètre et un nouvel appel pour obtenir le bouton suivant gérer quelques fois de plus.

Aussi pourriez-vous s'il vous plaît essayez de vérifier Marshal.GetLastWin32Error pour voir ce que le résultat de l'erreur est?

+0

salut Brian, à moins que j'aie mal compris ce que tu demandes je crois que le nom de classe doit toujours être une chaîne non? – Mike

+0

Corrigé ma réponse. –

+0

Salut Brian, Ok donne un essai et toujours rien :-) – Mike

2

Essayez ceci:

IntPtr ButtonHandle = FindWindowEx(p.MainWindowHandle, IntPtr.Zero, null, "Send"); 
0

Essayez de construire des projets comme x86. J'essaie et réussi!

1

Vous pouvez faire somthing comme ceci:

//Program finds a window and looks for button in window and clicks it 

HWND buttonHandle = 0; 

BOOL CALLBACK GetButtonHandle(HWND handle, LPARAM) 
{ 
    char label[100]; 
    int size = GetWindowTextA(handle, label, sizeof(label)); 
    if (strcmp(label, "Send") == 0) // your button name 
    { 
     buttonHandle = handle; 
     cout << "button id is: " << handle << endl; 
     return false; 
    } 
    return true; 
} 

int main() 

{ 
    HWND windowHandle = FindWindowA(NULL, "**Your Window Name**"); 

    if (windowHandle == NULL) 
    { 
     cout << "app isn't open." << endl; 
    } 

    else 
    { 
     cout << "app is open :) " << endl; 
     cout << "ID is: " << windowHandle << endl; 
     SetForegroundWindow(windowHandle); 
     BOOL ret = EnumChildWindows(windowHandle, GetButtonHandle, 0); //find the button 
     cout << buttonHandle << endl; 
     if (buttonHandle != 0) 
     { 
      LRESULT res = SendMessage(buttonHandle, BM_CLICK, 0, 0); 
     } 
    } 
} 

Cela devrait faire l'affaire.