2012-04-02 9 views
0

Ich möchte Griff des untergeordneten Fensters erhalten, kann aber nicht. Ich möchte Text automatisch in ein Bearbeitungssteuerelement einfügen. Hier ist, was ich habe:Handle des Kind-Fenster in C++

//global var 

int id=0; 

BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam) { 
    id = GetDlgCtrlID(hwnd); 
    HWND hwnd_Child; 
    hwnd_Child = GetDlgItem(hwnd, id); 
    SendMessage(hwnd_Child, WM_SETTEXT, NULL, (LPARAM)"mYtexttttt"); 
    /* other code */ 
    // id is always 0, why ? 
    // return FALSE; // stop enumerating 
    return TRUE; // continue enumeration 
} 

void MyFunction() 
{ 
    HWND hwnd_Parent; 

    hwnd_Parent = FindWindow(NULL,"MyTitle"); if(! hwnd)return; 

    EnumChildWindows(hWnd ,(WNDENUMPROC)EnumWindowsProc, NULL); 
} 

In WinSpy ++, die Steuer IDs aller Komponenten sind 000000000 Ist es möglich, dass die Steuer-ID nicht definiert ist?

Wie finde ich das Kind-Handle einer bestimmten (Edit Box) Komponente, wenn ich das Handle des Hauptfensters habe und die Kontroll-ID nicht definiert ist?

Auch das Hauptfenster ist eine Spielanwendung, die mit DirectX läuft, denke ich. Ich möchte Text automatisch in ein Bearbeitungssteuerelement einfügen.

+0

Manchmal sind IDs nicht definiert, aber Ihr Code sieht trotzdem falsch aus. Wie versuchen Sie, das untergeordnete Fenster zu identifizieren? Wie willst du sagen, was du willst? –

+0

für den ersten Test Ich versuche, SendMessage an alle Handler von EnumChildWindows gefunden .... aber das nicht hilft, möchte ich automatisch Text in einem Edit-Steuerelement einfügen – Jigberto

Antwort

2

Wenn WinSpy Ihnen mitteilt, dass die Kontroll-IDs 0 sind, dann ist natürlich das erwartete Ergebnis, dass eine 0 von GetDlgCtrlID() zurückgegeben wird. Sie müssen etwas anderes tun, z. B. die Anzahl der Aufrufe von EnumWindowsProc() herunterzählen und/oder GetClassName() aufrufen, damit Sie sehen können, dass es sich um ein Bearbeitungssteuerelement handelt. Oder GetWindowRect(), um nach Position zu gehen.

+0

Okay ... Ich habe getan, was Sie gesagt habe, ich verwendet GetClassName() und alle Komponenten haben den Klassennamen "Edit" und die Callback-Funktion I sendmessage an alle SendMessage (hwnd, WM_SETTEXT, NULL, (LPARAM) "mYtexttttttt"); – Jigberto

1

Kontroll-IDs sind eine bequeme Methode, untergeordnete Fenster zu identifizieren. aber nicht der einzige Weg. Es ist also durchaus möglich, dass die Kontroll-ID auf beliebige (oder Null-) Werte gesetzt wird (in diesem Fall verweist das Elternfenster direkt auf sie.)

Aus Ihrer Sicht, wenn keine Kontroll-IDs existieren, müssen Sie . verweisen sie von der Position in der Tab-Reihenfolge, die konstant sein soll und kann durch iteriert werden

+0

In Callback-Funktion sende ich Nachricht an alle Edit-Komponenten, Code: SendMessage (Hwnd, WM_SETTEXT, NULL, (LPARAM) "mYtexttttttt"); Aber das funktioniert nicht, warum? – Jigberto

+0

In Callback-Funktion Ich sende Nachricht an alle Edit-Komponenten, Code: SendMessage (Hwnd, WM_SETTEXT, NULL, (LPARAM) "mYtexttttttt"); Aber das funktioniert nicht, warum? – Jigberto

+0

Nicht sicher, dass Sie dies von einem externen Prozess/Thread tun können - scheint ein ernstes Sicherheitsrisiko für mich. – Elemental

2

in Ihrer Callback-Methode, tun Sie bitte folgendes:

// get the window text 
GetWindowText(hWnd, (LPTSTR)windowText, MAX_PATH); 

// get the window info 
WINDOWINFO objWinInfo; 
GetWindowInfo(hWnd, &objWinInfo) 

die oben sollten Sie die untergeordneten Fenster erhalten helfen.

Sie können auch FindWindowEx zum Abrufen der untergeordneten Fenster verwenden.

+0

Bitte lesen Sie meinen Beitrag, ich aktualisierte es ..... alles, was ich will ist Griff von Edit-Steuerelement zu finden und automatisch Text in Box einfügen ... aber ich bin nicht in der Lage, dies zu tun – Jigberto