2010-09-23 2 views
6

У меня есть программа, которая должна отправить сообщение BM_CLICK на другую кнопку приложения. Я могу получить дескриптор родительского окна, но когда я пытаюсь получить дескриптор кнопки, если всегда возвращается 0Получение дескриптора кнопки из другого приложения

Я получил название кнопки и название кнопки от Spy ++, это кажется правильным, но я знаю, что я, должно быть, получил что-то неправильно. Ниже мой код

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); 

    } 

} 

экран Spy выстрелил

alt text

ответ

5

Пытаться передать нуль для текста окна и вместо того, чтобы попытаться найти какую-либо кнопку:

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

После этого вы можете используйте второй параметр и новый вызов, чтобы получить следующую кнопку управления паролем еще раз.

Вы также можете проверить: Marshal.GetLastWin32Error, чтобы увидеть причину ошибки?

+0

привет Брайан, если я не понимаю, что вы просите, я считаю, что имя класса всегда должно быть строкой нет? – Mike

+0

Исправил мой ответ. –

+0

Привет, Брайан, Хорошо, дайте эту попытку и все еще ничего :-) – Mike

2

Попробуйте это:

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

Пытаться построить проект как x86. Я стараюсь и добиваюсь успеха!

1

Вы можете сделать Somthing так:

//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); 
     } 
    } 
} 

Это должно сделать трюк.