Unbekannte ID bekommen (am Beispiel einer ListBox)
-
Hi!
Arbeite im Moment wieder mit dem C++ Builder (Version 5). Ich versuche mit folgendem Code Dateinamen in eine ListBox zu bekommen:
HWND hDlg; hDlg = GetCurrentProcess(); HWND hList; hList = GetDlgItem(hDlg, [i]gesuchte ID von 'lb_Files'[/i]); DlgDirList(hDlg,".//Update//",hList,0,NULL);Mein Problem ist wie man sieht die ID der ListBox 'lb_Files'. Gibt es eine Funktion mit der man die ID bekommt? Beim C++ Builder haut man die ListBox einfach in das Formular und kann nirgendwo sehen was sie für eine ID hat. Einen Resourcen-Editor konnte ich auch nicht finden.
MfG dust
-
dust schrieb:
HWND hDlg; hDlg = GetCurrentProcess();
Hehe^^ Lustig

Mit GetCurrentProcess bekommst du ein Handle zu deinem Prozess, wie es der Name schon sagt... Ein Prozess und ein Fenster sind aber etwas grundlegend Verschiedenes! Viele Prozesse erzeugen zwar Fenster, aber deshalb sind sie keine.Um ein Fenster zu finden, kannst du FindWindow benutzen. Um ein Child-Fenster (etwa einen Button oder eine Listbox in einem Fenster) zu bekommen, benutze FindWindowEx.
Wenn es nur _eine_ Listbox in dem Fenster gibt, dann kannst du bei FindWindowEx als Child-Klassenname "LISTBOX" angeben (und bei Name nix). Ansonsten kannst du mit Spy++ oder ähnlichen Programmen sehr leicht die ID der Listbox rausfinden (wenn es nur von einem Programm auf deinem Rechner sein sollte).Grüße,
Badestrand
-
hm ... das verwirrt mich jetzt!? Wenn es so ist wie du sagst, warum bekomme ich dann keinen Error im Compiler?
Und was ist dann mit diesem Code, der auch compiliert wird ...
Bring[b]Window[/b]ToTop(GetCurrentProcess());Danke schonmal!
[EDIT]
Die Proggis zeigen bei jedem start eine andere ID an. Ich brauch die statische ID, welche normalerweise in der *.res datei liegt ...
[/EDIT]MfG dust
-
Dieser Code Zeile
BringWindowToTop(GetCurrentProcess());Bringt diese Fehlermeldung:
error C2664: 'BringWindowToTop' : cannot convert parameter 1 from 'HANDLE' to 'HWND'
Conversion from 'void*' to pointer to non-'void' requires an explicit castEntweder besorgst Du Dir die ID über den Spy++, wenn es immer das selbe Programm ist, oder Du musst eben die Fenster enumerieren (EnumWindows)
-
dust schrieb:
hm ... das verwirrt mich jetzt!? Wenn es so ist wie du sagst, warum bekomme ich dann keinen Error im Compiler?
Und was ist dann mit diesem Code, der auch compiliert wird ...
Bring[b]Window[/b]ToTop(GetCurrentProcess());Selbst wenn dieser Code kompiliert, dann wird er sicherlich nicht das machen, was er soll! Intern werden die Informationen zu Fenstern, Prozessen usw von Windows in Strukturen gespeichert. Zu diesen Strukturen bekommst du den Zugang durch Handles. Du kannst die Strukturen nicht direkt ansprechen, du musst immer Funktionen aufrufen, denen du ein Handle des Objektes übergibst (z.B. GetWindowRect, GetThreadPriority, FloodFill, ...).
Aus besseren Dokumentationen kann man entnehmen, dass BringWindowToTop(HWND hWnd) ein Handle zu einem Fenster (Wnd wie Window) erwartet.
Du übergibst aber ein Handle zu einem Prozess. Meinetwegen kannst du es kompilieren, aber dann erkennt dein Compiler eben nicht den Unterschied zwischen dem geforderten HWND-Handle und dem übergebenen Prozess-Handle.
Funktionieren wird dieses Stückchen aber auf keinen Fall!Dust schrieb:
[EDIT]
Die Proggis zeigen bei jedem start eine andere ID an. Ich brauch die statische ID, welche normalerweise in der *.res datei liegt ...
[/EDIT]?
-
Hi!
Danke für die Erklärungen.
Wo bekomme ich Spy++ her und wie wende ich es an ... im Compiler oder zur Laufzeit Sachen machen?
[EDIT]
Ich Frage weil ich bei Google (Keywords= "Spy++" und "Download") nix brauchbares gefunden hab außer Programme, die als ähnlich wie Spy++ angepriesen werden (Beispiel WinID). Diese habe ich angewendet (zur Laufzeit) des Programmes und es kamen bei jedem mal starten andere IDs raus.
[/EDIT]MfG dust
-
Spy++ ist ein Tool das Du mit Deinem Visual Studio geliefert bekommst. Es dient dazu das aktuelle "Fenster"-Layout zu analysieren.
Siehe Dein Tools Menü!
-
Danke für die Info! Aber ich schrieb ja ganz oben, dass ich den C++ Builder verwende (von Borland).
[EDIT]
Bekommt man Spy++ auch einzelnd? Oder kann ich andere Programme nehmen?
[/EDIT]
-
Es gibt auch andere Programme die sich aber alle nicht sonderlich unterscheiden. Können alle ansich das gleiche.
Wegen deiner ID. Wenn du jedesmal die ID dir holst dann ist doch egal wie diese letztendlich ist. Du kannst sie doch einfach Benutzen. Oder wolltest jetzt die ID "fest in deinen Programm programmieren"? Oder Versteh ich dich nicht?MfG schirrmie
-
Anscheinend ist es nicht ganz klar was ich will, deshalb hier eine genauere Erklärung:
Mein Programm soll direkt nach dem Start(Ereignis: FormCreate) alle Datei-Namen aus einem bestimmten Pfad in die ListBox schreiben. Die ListBox ist dabei von vornherein da, wird also nicht erst zur Laufzeit erstellt. Weiß nicht, ob das was zur Sache tut, aber die ListBox befindet sich in einer GroupBox, welche sich auf einem Panel befindet, welches wiederum auf der Form plaziert ist. Ich habe 2 Möglichkeiten gefunden um das zu realisieren. Einmal die Geschichte mit FindFirstFile() und FindNextFile() und dann die Funktion DlgDirList(), welche mir besser geeignet schien. Diese Funktion erwartet 5 Parameter:
DlgDirList(void * hDlg, char * lpPathSpec, int nIDListBox, int nIDStaticPath, unsigned int uFileType);
Und da liegt mein Problem. Ich weiß nicht, wie ich die benötigten Parameter bekomme.char * lpPathSpec ist kein Problem.
int nIDStaticPath setze ich 0, weil ich das net brauche.
unsigned int uFileType ist mir egal, deswegen standard -> NULL.Bei den anderen beiden Parameter habe ich keine Ahnung und brauche eure Hilfe.
MfG dust
-
dust schrieb:
Diese Funktion erwartet 5 Parameter:
DlgDirList(void * hDlg, char * lpPathSpec, int nIDListBox, int nIDStaticPath, unsigned int uFileType);
Und da liegt mein Problem. Ich weiß nicht, wie ich die benötigten Parameter bekomme.Dazu gibt es wie immer die Beschreibung in der MSDN.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/listboxes/listboxreference/listboxfunctions/dlgdirlist.asp
-
Tut mir Leid ich Versteh dich immer noch nicht.
Mein Programm soll direkt nach dem Start(Ereignis: FormCreate) alle Datei-Namen aus einem bestimmten Pfad in die ListBox schreiben. Die ListBox ist dabei von vornherein da, wird also nicht erst zur Laufzeit erstellt.
Also hat jetzt dein Programm die ListBox oder wie die ist von vornherein da?. Also wenn ich ein Prog schreibe ist da nie ne ListBox von vornerein da

MfG schirrmie
-
Ja, die habe ich darein gesetzt ^^!
Guck mir grad MSDN an!
-
Normalerweise sollte man als Programmierer die ID von seinen Controls kennen... Oder hast du wenigstens ein Handle zu der Listbox? Dann kannst du mit GetWindowLong und GWL_ID die ID holen.
-
Das ist mir klar, dass die IDs wichtig sind, aber ich kann die Resource-Datei nunmalnicht einsehen, bei dem komischen Borland Compiler!
Das in der MSDN hatt ich übrigens schon mal gelesen ... das bringt mich nicht weiter, da in diesem Beispil die ID der ListBox bekannt ist.
mfg
-
Badestrand schrieb:
[...] Um ein Child-Fenster (etwa einen Button oder eine Listbox in einem Fenster) zu bekommen, benutze FindWindowEx.
Wenn es nur _eine_ Listbox in dem Fenster gibt, dann kannst du bei FindWindowEx als Child-Klassenname "LISTBOX" angeben (und bei Name nix).
-
Hmm ich kenne mich mit den Borland nicht aus. Aber das hört sich so an als wen du mit einem Resourcen-Editor die Listbox da rein gesetzt hast. Aber Ich kann mir beim bestenn Willen nicht Vorstellen das deine IDE dir dann die ID nicht anzeigt oder so. Tut mir Leid aber wenn dann solltest du dich mal in deine IDE einarbeiten oder ich hab es immer noch nicht Verstanden

MfG schirrmie
-
schirrmie. schrieb:
Hmm ich kenne mich mit den Borland nicht aus. Aber das hört sich so an als wen du mit einem Resourcen-Editor die Listbox da rein gesetzt hast. Aber Ich kann mir beim bestenn Willen nicht Vorstellen das deine IDE dir dann die ID nicht anzeigt oder so. Tut mir Leid aber wenn dann solltest du dich mal in deine IDE einarbeiten oder ich hab es immer noch nicht Verstanden

MfG schirrmie
Dem kann ich nur zustimmen!
-
Nee, ich hab die ListBox ganz normal mit dem C++ Builder reingehauen. Und der C++ Builder zeigt einfach keine IDs an deswegen frag ich ja nach Funktionen die das machen ... oder irgendwas anderem was mir die IDs anzeigt!
Habe die ganze Geschichte jetzt doch mit FindFirstFile() und FindNextFile() gemacht. Aber wenn da noch was kommt, dann wär' das trotzdem schön^^.
MfG
-
dust schrieb:
Habe die ganze Geschichte jetzt doch mit FindFirstFile() und FIndNextFile gemacht.

Wenn du die Dateien mit FindFirstFile/FindNextFile raussuchst, kannst du deren Namen _doch_ in die Listbox schreiben?? Oder hab ich da was völlig falsch verstanden?