ERLEDIGT: GetWindowLong GWL_STYLE
-
Hallo zusammen,
ich habe folgenden Code, um mir in Delphi anzeigen zu lassen, ob ein (Child-)Window
ein RadioButton oder eine CheckBox ist, dass selbige funktioniert in C++ aber einfach nicht.Weiß jemand woran das liegen kann? Hier beide Sources:
type TWindowStyles = record BS_RADIOBUTTON, BS_CHECKBOX : Boolean; end; var WindowStyles : TWindowStyles; hWindow : HWND; winTitle : PCharArray; f_wintitle : PCharArray; begin (* of main *) new( winTitle ); new( f_wintitle ); winTitle^ := 'Rechner'; hWindow := FindWindowA( nil, PChar(winTitle) ); hWindow := 265814{00050E34}; // Direktes Handle, da ich hier keine EnumChildWindows-Func habe writeln( 'BS_RADIOBUTTON = ', WindowStyle.BS_RADIOBUTTON ); writeln( 'BS_CHECKBOX = ', WindowStyle.BS_CHECKBOX ); end;
#include <windows.h> #include <winuser.h> #include <tchar.h> #include "hChilds.h" #include "sav.h" typedef struct _WindowStyles { bool RADIOBUTTON, CHECKBOX; } __WindowStyles; int main( int argc, char* argv[] ) { SetConsoleTitle( _T("GetChilds") ); HWND hConsl = FindWindow( NULL, _T("GetChilds") ); wchar_t* lpWindowTitle; lpWindowTitle = new wchar_t[7](); *(lpWindowTitle + 0) = L'R'; *(lpWindowTitle + 1) = L'e'; *(lpWindowTitle + 2) = L'c'; *(lpWindowTitle + 3) = L'h'; *(lpWindowTitle + 4) = L'n'; *(lpWindowTitle + 5) = L'e'; *(lpWindowTitle + 6) = L'r'; *(lpWindowTitle + 7) = L'\0'; HWND hWindow = FindWindow( NULL, lpWindowTitle ); cout << "mainWindow : " << hWindow << endl; HWND* hChild = GetChildWindows( hWindow ); char* ChildTitle = new char[255](); char* ChildClass = new char[255](); // WNDCLASSA ClassInfo; DWORD ClassStyle; __WindowStyles WindowStyle; for( int i = 0; i < 78; i++ ) { GetWindowTextA( hChild[i], ChildTitle, 255 ); GetClassNameA( hChild[i], ChildClass, 255 ); //GetClassInfoA( NULL, ChildClass, &ClassInfo ); if( *(ChildTitle + 0) != 0 ) { ClassStyle = GetClassLongA( hChild[i], GWL_STYLE ); cout << i << "\t" << ChildTitle << "\t" << ChildClass << "\t"; WindowStyle.CHECKBOX = ((ClassStyle && BS_CHECKBOX) == BS_CHECKBOX); WindowStyle.RADIOBUTTON = ((ClassStyle && BS_RADIOBUTTON) == BS_RADIOBUTTON); cout << WindowStyle.CHECKBOX << "\t" << WindowStyle.RADIOBUTTON << endl; } } SaveToFile( hChild ); delete[] ChildTitle; delete[] ChildClass; delete[] hChild; return 0; }
"Funktioniert nicht" heißt hier, dass er immer 0 zurückliefert, auch wenn es sich um einen RadioButton / eine CheckBox handelt.
-
((ClassStyle && BS_CHECKBOX) == BS_CHECKBOX)
Dieser Ausdruck ist immer
FALSE
.&&
ist ein logisches UND was du brauchst ist&
, das bitweise UND.
-
O.o schrieb:
((ClassStyle && BS_CHECKBOX) == BS_CHECKBOX)
Dieser Ausdruck ist immer
FALSE
.&&
ist ein logisches UND was du brauchst ist&
, das bitweise UND.Danke für die Antwort. Diese logische Verknüpfung ist mittlerweile aus Verzweiflung entstanden^^,
denn auch "&" bringt nicht das gewünschte Resultat. Weiterhin immer False.
Und wie gesagt, das selbige in Delphi funktioniert ja schließlich ...Irgendjemand noch eine Idee?
EDIT: Die Sache ist erledigt. Es lag am Funktionsaufruf, der mir den Style für die Klasse (Button) geliefert hat und nicht für das ChildWindow ... naja, es sind halt immer die einfachsten Sachen die einen aufhalten.