NickTheGreek Δημοσ. 22 Ιανουαρίου 2002 Δημοσ. 22 Ιανουαρίου 2002 Kserei kaneis pos mporo na bro to hwnd enos parathirou pou den exei titlo?
Directx Δημοσ. 22 Ιανουαρίου 2002 Δημοσ. 22 Ιανουαρίου 2002 Μπορείς :<p>1ον) Να μάθεις το HWND του παραθύρου που σε ενδιαφέρει ακόμα και αν γνωρίζεις μόνο το όνομα του Class του (και εφόσον αυτό είναι μοναδικό φυσικά) με την εντολή FindWindow(lpClassName,lpWindowName) όπου FindWindow(Class..,NULL).<p>2ον)Μπορείς να ενημερωθείς για όλα τα διαθέσιμα παράθυρα που υπάρχουν με τις εντολές EnumWindows (και τα CALLBACK EnumWindowsProc), EnumChildWindows (και το CALLBACK EnumChildWindowsProc).<p>3ον)Μπορείς να ενημερωθείς για όλα τα παράθυρα μιας εφαρμογής με την βοήθεια της εντολής GetWindowThreadProcessId και την συντονισμένη χρήσει των εντολών της βιβλιοθήκης ToolHelp32 (Process32First, Process32Next κοτ..) και του 2ου τρόπου.<p>4ον)Τέλος αν γνωρίζεις την θέση του παραθύρου (π.χ. έχεις γράψει κάποιο λογισμικό που κάνει αυτή τη δουλεία παρακολουθεί τη θέση που έχει το βελάκι στην οθόνη) μπορείς να χρησιμοποιήσεις τις εντολές ChildWindowFromPoint & WindowFromPoint.<p>Εγώ όταν θέλω να μάθω για ένα τέτοιο παράθυρο προτιμώ ή την πρώτη μέθοδο ή συνδυασμό του 2 και 3 τρόπου.<p>(Όλες οι εντολές υπάρχουν αναλυτικά στο Win32s SDK άρα δεν θα έχεις πρόβλημα να δεις πως ακριβός λειτουργούν)<p>Ελπίζω να βοήθησα, Καλή τύχη.
NickTheGreek Δημοσ. 23 Ιανουαρίου 2002 Μέλος Δημοσ. 23 Ιανουαρίου 2002 1.To onoma tou class to gnorizo alla to kako einai oti den einai monadiko<p>2.To exo eidi dokimasei alla kai pali den emfanizei to parathiro pou den exei label (den exei oute to plaisio pou iparxei sto pano meros ton parathiron).<p>3.H alitheia einai pos den ksero pos na to xrisimopoiiso,an kai efoson stirizetai sto 2 pithanos den tha leitourgisei.<p>4.Distixos den thn gnorizo<p>To problima to exo lisei me to na apothikeuo kapou to hwnd tou parathirou molis fortonei to programma,apla ithela enan pio aplo tropo.<p>Telospanton epeidi fainetai oti eisai apo tous ligous pou kseroun arketa pragmata exo kai alles apories pou elpizo na mou tis liseis.<p>1.O logos gia ton opoio to parathiro pou sou leo den exei plaisio(ara kai label), einai giati thelo to plaisio na to xromatizo ego kai oxi na pairnei to xroma ton koinon parathiron (mple sthn periptosi mou).Ksereis kapoion tropo gia na tou allakso to xroma?(ennoeitai allon apo to na allakso to default xroma ton windows)<p>2.Otan kaneis deksi click se ena arxeio/fakelo auto emfanizei ena menu.Exo balei dikes mou epiloges mesa ekei, alla den ksero pos na balo kai submenu (blepe Send To h Cuteftp an exeis)<p>Auta kai eyxaristo.An thes sou stelno kai to programma na kaneis tests
Directx Δημοσ. 23 Ιανουαρίου 2002 Δημοσ. 23 Ιανουαρίου 2002 Χμ, μια μικρή διευκρίνιση: Αν είναι δικό σου το πρόγραμμα και φτιάχνεις εσύ το παράθυρο δεν χρειάζεται να ταλαιπωρηθείς τόσο μιας και οι παραπάνω τρόποι αφορούν μεθόδους για να βρίσκουμε έμμεσα τα HWND άλλων «ξένων» λογισμικών. Οπότε σε μια τέτοια περίπτωση απλώς έχε υπόψη σου ότι όλες σχεδόν οι ρουτίνες κατασκευής παραθύρων (CreateWindow κοτ...) ή διαλόγων (CreateDialog κοτ...) επιστρέφουν πάντα HWND.<p>Τώρα όσο αφορά την 2 μέθοδο, δουλεύει πάντα αρκεί να δομηθεί σωστά, βλέπεις έχω γράψει ένα Windows SPY οπότε ένα τμήμα του βασίζεται στις μεθόδους που σου ανέφερα παραπάνω (κάποια στιγμή ίσως το κυκλοφορήσω ως freeware : - )<p>Τώρα όσων αφορά την 1. ερώτηση τα πράγματα είναι σχετικά δύσκολα και κουραστικά διότι πρέπει να επέμβεις στην caption bar του παραθύρου (ή καλύτερα non-client area) άρα θα πρέπει να μπλεχτείς με τις ρουτίνες σχεδιασμού των Windows (GDI) συγκεκριμένα θα πρέπει να δεις την ρουτίνα GetWindowDC η οποία επιστρέφει ένα DC που αφορά ολόκληρο το παράθυρο (μπάρες κύλισης, caption bar κοτ.) σε αντίθεση με την απλή GetDC που επιστέφει το DC μόνο του Window Client Area.<p>Το θέμα είναι ότι από εκεί και πέρα πρέπει να ζωγραφίσεις εσύ την caption bar, να δώσεις τίτλο και τα εικονίδια συστήματος! Είναι λοιπόν μια δύσκολη διαδικασία που μπορεί να γίνει με αρκετούς τρόπους όπως με απευθείας βαφή μέσο της Rectangle και των κλασσικών GetStockObject, SetStockObject, CreateBrushIndirect κοτ.. ή πιο ευέλικτων και αποτελεσματικών τρόπων όπως της CreateBitmapIndirect κοτ.. <p>Εγώ είχα ασχοληθεί λίγο με την κατασκευή μιας Degrade Caption Bar (σαν των 98 και μετά) αλλά ήταν ιδιαίτερα κοπιώδης διαδικασία και την παράτησα πιστεύω όμως ότι αν θέλεις απλά ένα χρώμα οι παραπάνω ρουτίνες είναι μια καλή αρχή (τέλος αν προγραμματίζεις σε RAD εργαλεία πχ. Delphi, C/C++ Builder, VB μπορείς να βρεις έτοιμα components για αυτή του δουλεία ! ή ούτως ή άλλως πολλά source για οποιαδήποτε γλώσσα στο internet ;-)<p> Για την 2. ερώτηση δεν έχω το CuteFTP αλλά αν κατάλαβα καλά θέλεις να δημιουργήσεις sub-menus, λοιπόν θα πρέπει να δεις τις λειτουργία CreatePopupMenu,SetMenu ,αν και θα σου πρότεινα να σχεδιάσεις το μενού πρωτύτερα μέσο κάποιου Resource Editor (πχ. Borland Resource Workshop 4) γιατί καμία φορά οι ρουτίνες κατασκευής του δεν αντιδρούν σωστά (είναι μπελάς)...<p>Αν τώρα θέλεις ένα μενού όπως του Explorer τότε τα πράγματα οδεύουν προς OLE/COM οπότε γίνονται εξαιρετικά περίπλοκα...<p>* Για την εφαρμογή σου δεν έχω πρόβλημα, θα σου στείλω μέσο PM το email μου σύντομα.
NickTheGreek Δημοσ. 24 Ιανουαρίου 2002 Μέλος Δημοσ. 24 Ιανουαρίου 2002 Loipon, dokimasa na zografiso to caption bar,afou prota pira to dc tou parathirou opos mou eipes me thn GetWindowDC,alla emfanistikan ta eksis problimata<p>1.Ta grammata sto caption kaliftikan kai den ksero pos na grapso kati allo apo pano xoris na figei to neo xroma.<p>2.Ena mikro plaisio giro apo ta buttons(max-min) pou iparxoun sto caption emeine axromatisto.(ayta den kaliptontai)<p>3.Se kathe activate/deactivate tou caption bar to palio xroma epanerxetai.<p>Tora an me ton oro Degrade Caption Bar ennoeis caption bars me kimainomeno xroma,tote exo ena module pou brika sto net kai tropopoiisa, pou kanei aythn thn douleia.An to thes pes mou.<p>Oso gia to submenu brika thn akri.Anaferomai sto menu tou exlporer kai ontos ta pragmata htan periploka afou xreiastike dimiourgia com/ole dll,to opoio brika sto site ths MS kai tropopoiisa katallilos.Exoyn prokipsei omos alla 2 problimata.<p>A.Thelo na prostheso to ikonidio ths efarmogis dipla sto menu kai eos tora den to exo kataferei,giati eidika ayto to COM DLL thelei ena sygkekrimeno megethos eikonidion.Me ligi pantos doulitsa tha kamfthei kai ayto.<p>B.Gia na kano register to DLL prepei ,afou to kano compile apo thn VB, na anatrekso sto registry kai sygkekrimena sto HKEY_CLASSES_ROOT\pIContextMenu.ShellExt\Clsid ,opou kai brisketai to Clsid toy,na to antigrapso kai na to peraso se alla simeia toy registry oste otan kano deksi click se arxeia,directories, na emfanizontai sto menu oi epiloges pou thelo.<p>To programma ayto omos thelo na to trekso kai se allous ipologistes sto topiko diktio pou exo kai opos katalabaineis den mporo na to kano register afou to CLSid tou DLL to pairno meta apo to compile kai gia ton diko mou ipologisti mono.<p> Asxeto alla h douleia sou exei sxesi me ton programmatismo?
Directx Δημοσ. 24 Ιανουαρίου 2002 Δημοσ. 24 Ιανουαρίου 2002 Λοιπόν:<p>1ον) Είναι φυσιολογικό ότι τα γράμματα του caption bar καλύπτονται από το σχέδιο που τοποθετείς για αυτό πρέπει κάθε φορά με την λήξη του σχεδίου σου να προβαίνεις σε εκτύπωση του caption text μόνος σου, εδώ θα μπορούσες να δεις τις ρουτίνες GetWindowText (για να πάρεις το caption text) και TextOut, DrawText κοτ, ExtTextOut (προτίμησε τη είναι αρκετά δυνατή!).. ώστε να γράψεις (ουσιαστικά να σχεδιάσεις) σε όποιο σημείο θέλεις στο DC του παραθύρου το caption text.<p>Για το χρώμα των γραμμάτων μπορείς να δεις τις ρουτίνες SetTextColor (για αλλαγή του foreground color των TextOut & ExTextOut) ή SetBkColor (για αλλαγή του background color ομοίως).<p>Φυσικά θα πρέπει να έχεις υπόψη σου ότι το μέγεθος των φόντων θα πρέπει να είναι ανάλογο του caption bar ώστε να μην ξεφεύγει εκτός ορίων είτε κάθετα ή οριζόντια (δες και την GetSystemMetrics).<p>2ον) Θα σου πρότεινα ως σκέψη να «κρύψεις» τα εν λόγω system buttons και να τα σχεδιάσεις με καθαρά GDI λειτουργίες (για να κάνεις minimize, maximize ένα παραθύρου δες την ρουτίνα ShowWindow).<p>3ον) Χωρίς να το έχω δοκιμάσει νομίζω ότι πρέπει να βρει έναν τρόπο ώστε κάθε φορά που ενεργοποιείται ή απενεργοποιείται το παράθυρο να ενημερώνεσαι για αυτό ώστε να προσαρμόζεις κατάλληλα τα χρώματα του. Στη θέση σου θα έβλεπε τα μηνύματα WM_ACTIVATE & WM_MOUSEACTIVATE & WM_NCACTIVATE τα οποίο κάθε φορά επιστρέφουν τιμές σχετικά με την κατάσταση που βρίσκεται το παράθυρο (ενεργώ, ανενεργό κοτ..)<p> Β) Αν και δεν έχω ασχοληθεί ιδιαίτερα με την αρχιτεκτονική COM (τώρα σκέφτομαι να αρχίσω να «ψάχνω» τα πράγματα της : - ) νομίζω ότι ο Install Shield έχει ειδική πρόβλεψη για αυτοματοποίηση της διαδικασίας registering τους οπότε αν τον διαθέτεις ριχτού μια ματιά (εγώ δεν τον χρησιμοποιώ), από την άλλη πλευρά μελετώντας λίγο το SDK παρατήρησα ότι μπορείς να εγκαταστήσεις με τη βοήθεια του RegSvr32 (δες στο system directory) COM components αλλά οι πληροφορίες γύρω από αυτόν είναι λίγες, τέλος έχε υπόψη σου ότι το CLSID είναι ουσιαστικά ένας μοναδικός αριθμός (που δημιουργείται κατά το MS-SDK με συνδυασμό ώρας, λεπτών κοτ...) οπότε αν δεν βρεις άκρη.. φτιάξε ένα δικό σου installer που θα τοποθετεί στη registry τα απαραίτητα keys, values (και φυσικά θα παράγει έναν τυχαίο CLSID) ώστε να βλέπει το COM interface το object σου!<p> * Η τελευταία λύση δεν είναι η κομψότερη που υπάρχει αλλά αν ζορισθείς αρκετά και δεν βγάλεις άκρη με τα άλλα δυο εργαλεία τότε αποκτά εξαιρετικό ενδιαφέρον απλώς πρέπει να ψάξεις καλά το registry ώστε να δεις πως το εγκαθιστά η VB. Και από εκεί και πέρα ...τυφλοσούρτης (εκτός του CLSID όπου είναι απαραίτητο από κάποια τεστ που έκανα είναι βαρετό αλλά νομίζω εφικτό βλέπεις το «φτιάξε το μόνο σου» μου έμεινε σύμπλεγμα από την εποχή του DOS ;-)<p>* Χμ, τώρα που το σκέφτομαι θα μπορούσες να καλέσεις το RegSvr32 και μόλις τελειώσει την εγκατάσταση (παράγει δικό του CLSID και τοποθετεί το OCX/DLL σε διάφορα κλειδιά του registry) να το βρίσκεις με κώδικα σου και να παίρνεις το CLSID του χρησιμοποιώντας το πια όπου θέλεις εσύ (απλά θα πρέπει μάλλον να κάνεις τον κόπο να γράψεις εναν μίνι installer .. κλήση στο RegSvr32.. έλεγχος registry για εύρεση αποτελέσματος, δικέ σου ενέργειες registration του CLSID στο ShellExt κοτ.. ίσως δε να είσαι τυχερός και το RegSvr32 να τα κάνει όλα αυτόματα είπαμε δεν υπάρχει αρκετό feed-back γύρο από αυτό.. αλλά ούτως ή άλλως θα έχεις ένα μοναδικό CLSID και βασικό registration του DLL σου οπότε ο κόπος μετριάζεται).<p>Καλή επιτυχία!<p>[ 24-01-2002: Το μήνυμα επεξεργάστηκε από: Directx ]</p>
NickTheGreek Δημοσ. 29 Ιανουαρίου 2002 Μέλος Δημοσ. 29 Ιανουαρίου 2002 Enimerosi: Ton epanaxromatismo ton egkateleipsa giati ginetai poliploko kai den aksizei to psaksimo.Periorizomai stin apothikeysi ton hwnd sto registry.<p>Oso gia to registration toy DLL eftiaksa enan diko mou installer giati akoma kai me ton Visual Installer ton opoio katebasa apo to net,den ebgaza akri,isos ekana kati ego lathos.Pliroforiaka sou leo gia na exeis ypopsin sou oti:<p>Me to Regsvr32,opos alloste aneferes kai esy,kaneis register to DLL.Tora gia to diko mou DLL pou einai com, (fantazomai oti isxuei kai gia alla dlls/ocx) me to registration meso Regsvr32, dimiourgeitai sto CLASSES_ROOT tou registry, key to opoio exei onoma to onoma tou project me to opoio dimiourgithike to DLL,teleia kai to onoma tou class pou briksetai sto DLL <p>p.x. esto nick.dll to dll, to key mporei na einai Project1.Myclass (aneksartito tou onomatos tou dll)<p>Ayto to key periexei polles plirofories opos to path tou dll to CLSid kai alla.<p>Tora to installation programmataki afou treskei to Regsvr32,pairnei ayto to CLSid kai dimiourgei ena reg arxeio (aparaitito gia na emfanizetai to menu me deksi click), to opoio kai stin synexeia trexei kai FINITO.<p>Ayta.Eyxaristo gia thn boitheia.An parousiastei kati allo elpizo na eisai edo na ta poume.
Directx Δημοσ. 29 Ιανουαρίου 2002 Δημοσ. 29 Ιανουαρίου 2002 Ωραίος ! : - ) <p>Όποτε παραστεί ανάγκη θα είμαι εδώ ; - )
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.