[VC++ 2005] HWND finden

Baron Sengir

Mitglied
Hallo Ihr Lieben,

ich programmiere gerade eine dialogfeldbasierende MFC-Anwendeung in VC++ 2005 und benötige das HWND auf's Anwendungsfenster.

Kommen wir zu den Details: Ich habe eine eigene Klasse programmiert, die an das Hauptfenster eine Message schicken soll, dafür brauche ich aber oben erwähntes HWND.


Nach (ehrlich!) tagelangen Herumprobieren, Suchen und MSDN-Durchstöbern, habe ich jetzt eine Krücke hingekriegt:

Aus einer Stringtable (damit ich beim späteren Umbenenen keine Sorgen habe) lade ich die gewünschte Bezeichnung für das Hauptfenster ein und setzte diesen String bei OnInitDialog als Fenstertitel fest. Das mache ich so:
Code:
TCHAR sz[160]; 
LPCTSTR temp;
LoadString(GetModuleHandle(NULL), IDS_TITLE, sz, sizeof(sz)/sizeof(TCHAR)); 
temp = (LPCTSTR) sz; 
SetWindowTextA( temp );

In meiner Klasse dann, lade ich aus der Stringtable den Fenstertitel in die Variable m_ParentName, suche das Fenster und sende dann die Message. Das geschieht so:

Code:
HWND hWnd = ::FindWindow(NULL, _T(m_ParentName));
if (hWnd) PostMessage( hWnd, WM_PLAYER_CALLBACK, wParam , lParam);

Ich glaube, das Ganze geht doch sicherlich viel einfacher und besser, oder? Nur leider weiss ich überhaupt nicht wie. Versuch mit GetParent() gingen allesamt schief. Vielleicht kann mir ja von Euch einer weiterhelfen.

Danke

Markus
 
Wenn du Zugriff auf die Klasse deines Hauptfensters hast, das von CWnd abgeleitet ist, kannst du mit GetSafeHWND das HWND des Fenster holen.

Sonst, nur MFC-spezifisch, kannst du AfxGetMainWnd aufrufen, dort bekommst du das CWnd des Hauptfensters, von dem du dann auch GetSafeHWND aufrufen kannst.

MFC-unabhängig dürfte GetForegroundWindow sein, allerdings kann dir da auch ein anderes Programm vorne rein springen.
 
Hi,

Danke für die Tipps.

GetSafeHWND() funktioniert leider nicht, weil ich irgendwie zu blöd bin, auf die Klasse meines Hauptfensters zuzugreifen.

An GetForegroundWindow() hatte ich auch schon gedacht, aber eben wegen der Gefahr, dass ein anderes Programm mir dazwischen kommt wierder verworfen.

AfxGetMainWnd () klingt sehr vielversprechend. Werde ich heute noch gleich ausprobieren und dann berichten. Leider werde ich erst heute Abend Zeit dafür haben.

Vielen Dank und Liebe Grüße

Markus
 
Hallo,

ich habe das jetzt probiert und es klappt wunderbar. Jetzt kann ich mir den Kram mit der Stringtable sparen!

Für alle die, die wissen wollen wie's in der Praxis aussieht:
Code:
HWND hWnd = AfxGetMainWnd()->GetSafeHwnd();
if (hWnd) PostMessage( hWnd, WM_PLAYER_CALLBACK, wParam , lParam);

Liebe Grüße und Danke nochmals

Markus
 
Zur Info: Das GetSafeHwnd kannst du dir sparen, du bekommst ja ein CWnd* zurück, und CWnd kapselt alle Aufrufe. Das könnte vereinfacht auch so aussehen:

AfxGetMainWnd()->PostMessage( WM_PLAYER_CALLBACK, wParam , lParam );
 

Neue Beiträge

Zurück