HWND eines Fenster holen - wie?
-
Ich möchte mir von einem fenster das HWND holen. Ich weis das es da eine Funktion führ gibt, aber ich hab den Namen vergessen und darum find ich die jetzt auch nicht wieder.
meine suchanfragen bei goolge sind auch zu wage als das ich da jetzt erfolg hätte. kann mir jemand mal auf die sprünge helfen?
wie krieg ich den HWND eines Fensters abgefragt? Würd die Variable jetzt nur ungern global deklarieren.
-
Meinst du vllt "FindWindow"?
-
Äh. Von welchem Fenster?
Zeig mal wie die Lösung mit der globalen Variable aussieht, vielleicht versteht dann einer was genau du machen willst.
-
JA ich meinte FindWindow.
Aber wie jetzt feststelle löst das mein Problem nicht....
Ich habe ein Dialogfenster mit einem dropdown menu(combobox also) in dieses möchte ich aus einer anderen funktion einen auswahlpunkt hinzufügen. diese auswahlpunkte stehen nicht fest, können also belieb viele sein.
hier mal die callback routine des dialoges:
INT_PTR CALLBACK InputDevices(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { HWND hDropdown; UNREFERENCED_PARAMETER(lParam); switch (message) { case WM_INITDIALOG: { hDropdown = CreateWindow(L"combobox",L"Die Combobox" , CBS_DROPDOWNLIST | WS_VISIBLE | WS_CHILD , 20, 20, 200, 200, hDlg, (HMENU) 1000, NULL , NULL); g_pDirectInput->EnumDevices(DI8DEVCLASS_ALL,EnumDeviceCallback , NULL, DIEDFL_ALLDEVICES); //SendDlgItemMessage(hDlg, 1000, CB_ADDSTRING, 0, (LPARAM) L"Test"); return (INT_PTR)TRUE; } case WM_COMMAND: if(LOWORD(wParam) == IDOK) EndDialog(hDlg,(INT_PTR)TRUE); break; case WM_CLOSE: EndDialog(hDlg,(INT_PTR)TRUE); break; } return (INT_PTR)FALSE; }
Und das hier ist die methode, die dann die auswahlpunkte in die combobox reinsetzen soll
BOOL CALLBACK EnumDeviceCallback(LPCDIDEVICEINSTANCE devInstance, void* pRef) { HWND hFindWindow = NULL; hFindWindow = FindWindow(L"combobox", L"Die Combobox"); SendDlgItemMessage(hFindWindow, 1000, CB_ADDSTRING, 0, (LPARAM) L"callback"); return DIENUM_STOP; }
-
Das ist doch unsinnig. Du brauchst doch für so etwas FinwWindow nicht.
Du hast doch die ID Deines Controls. Du hast es selbst mit der ID 1000 erzeugt. Aber noch einfach ist es doch einfach das Handle des Fensters an die Enum Funktion zu übergeben und direkt zu benutzen. Dazu kannst Du doch den benutzerdefinierten Wert verwenden.
-
Martin Richter schrieb:
Das ist doch unsinnig. Du brauchst doch für so etwas FinwWindow nicht.
Du hast doch die ID Deines Controls. Du hast es selbst mit der ID 1000 erzeugt. Aber noch einfach ist es doch einfach das Handle des Fensters an die Enum Funktion zu übergeben und direkt zu benutzen. Dazu kannst Du doch den benutzerdefinierten Wert verwenden.Also die callback funktion die ich aufrufe gehört zu DirectX, da kann ich so ohne weiteres nichts ändern. Was genau nutzt mir die Alleinige ID des Fenster ich hbrauch ja das handle auch.
mit einem globalen HWND in dem ich das Dialoghandel speichere klappt es, wobei ich das sehr unschön finde.
-
mit der ID kriegste aber das HWND raus: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/WindowsUserInterface/Windowing/DialogBoxes/DialogBoxReference/DialogBoxFunctions/GetDlgItem.asp
-
INT_PTR CALLBACK InputDevices(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { HWND hDropdown; UNREFERENCED_PARAMETER(lParam); switch (message) { case WM_INITDIALOG: { hDropdown = CreateWindow(L"combobox",L"Die Combobox" , CBS_DROPDOWNLIST | WS_VISIBLE | WS_CHILD , 20, 20, 200, 200, hDlg, (HMENU) 1000, NULL , NULL); g_pDirectInput->EnumDevices(DI8DEVCLASS_ALL, EnumDeviceCallback, LPVOID(hWnd), DIEDFL_ALLDEVICES); //SendDlgItemMessage(hDlg, 1000, CB_ADDSTRING, 0, (LPARAM) L"Test"); return (INT_PTR)TRUE; } case WM_COMMAND: if(LOWORD(wParam) == IDOK) EndDialog(hDlg,(INT_PTR)TRUE); break; case WM_CLOSE: EndDialog(hDlg,(INT_PTR)TRUE); break; } return (INT_PTR)FALSE; }
und dann:
BOOL CALLBACK EnumDeviceCallback(LPCDIDEVICEINSTANCE devInstance, LPVOID lpData) { SendDlgItemMessage(reinterpret_cast<HWND>(lpData), 1000, CB_ADDSTRING, 0, (LPARAM)TEXT("callback")); return DIENUM_STOP; }
Sollte eigentlich gehen. Ich mein das die EnumDeviceCallback Funktion so ne Möglichkeit drin hatte ...