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.


Anmelden zum Antworten