Directx Δημοσ. 23 Μαΐου 2006 Δημοσ. 23 Μαΐου 2006 Δυστυχώς αυτό συμβαίνει διότι η ρουτίνα επιδρά πάνω σε όλα τα top-level παράθυρα της διεργασίας αφού όπως προείπα δεν έχω κάποιο άλλο στοιχείο (πχ. class name ή τυχόν windows properties κτλ.) πέραν του process id. Αν από την άλλη πλευρά γνωρίζεις κάποια χαρακτηριστικά του παράθυρου που σε ενδιαφέρει μπορείς εύκολα να αυξήσεις με περισσότερους περιορισμούς την συνθήκη ελέγχου if(dwPID) ώστε τα αποτελέσματα να είναι λιγότερο ή καθόλου γενικά δηλαδή να μην επηρεάζονται όλα τα παράθυρα της διεργασίας.
kath Δημοσ. 23 Μαΐου 2006 Μέλος Δημοσ. 23 Μαΐου 2006 Εμφανιζονται οι παρακατω φορμες : 1) Μια κενη ( που δεν υπαρχει στο project ) 2) optionsHWND 3) TrayMinimize Θα "παιξω" λιγο με τη ρουτινα ελεγχου , και βλεπουμε
kath Δημοσ. 23 Μαΐου 2006 Μέλος Δημοσ. 23 Μαΐου 2006 Εμφανιζονται οι παρακατω φορμες : 1) Μια κενη ( που δεν υπαρχει στο project ) 2) optionsHWND 3) TrayMinimize Θα "παιξω" λιγο με τη ρουτινα ελεγχου ' date=' και βλεπουμε [/quote'] Δοκιμασα το παρακατω: > if((dwPID==lParam) && (dwPID!='TrayMinimize') && (dwPID!=' ') && (dwPID!='optionsHWND') ) { } Αλλα δεν γινεται τιποτα......
Directx Δημοσ. 23 Μαΐου 2006 Δημοσ. 23 Μαΐου 2006 Για να ελέγξουμε τον τίτλο (Caption) των παραθύρων καλούμε την εντολή GetWindowText μαζί με το HWND που μας ενδιαφέρει. Εάν το παράθυρο δεν έχει τίτλο τότε η GetWindowText επιστρέφει μηδέν διαφορετικά τον αριθμό χαρακτήρων που απαρτίζουν τον τίτλο. Ο παρακάτω κώδικας αποθηκεύει (szCaption) κάθε τίτλο παράθυρου της process id που μας ενδιαφέρει (GetWindowText) και αν είναι το μέγεθος του μηδέν ή ταιριάζει με τα κείμενα TrayMinimize & optionsHWND εφαρμόζει την εντολή ShowWindowAsync, ο κώδικας προσπαθεί να είναι όσο το δυνατόν απλούστερος. > BOOL CALLBACK EWProc(HWND hWnd,LPARAM lParam) { // Traverse all top-level windows DWORD dwPID; char szCaption[128] = ""; GetWindowThreadProcessId(hWnd,&dwPID); // Process IDs match if(dwPID==lParam) { // Check window title (caption) also! GetWindowText(hWnd,szCaption,sizeof(szCaption)); if(!lstrcmp(szCaption,"optionsHWND") || !lstrcmp(szCaption,"TrayMinimize") || !lstrlen(szCaption)) { ShowWindowAsync(hWnd,_nCmdShow); _bSomethingFound = TRUE; } } // Continue list traverse return TRUE; }
kath Δημοσ. 23 Μαΐου 2006 Μέλος Δημοσ. 23 Μαΐου 2006 Δυστυχως δε γινεται τιποτα :/ Ακομα και το κενο παραθυρο εμφανιζεται
Directx Δημοσ. 24 Μαΐου 2006 Δημοσ. 24 Μαΐου 2006 Συγνώμη αλλά κατάλαβα αντίστροφα αυτό που ζητούσες (μου διέφυγε το != στις συνθήκες σου και το πέρασα για == :( ) , συνεπώς δοκίμασε τον παρακάτω κώδικα ο οποίος αυτή την φορά αγνοεί τα παραπάνω παράθυρα και εκείνο που έχει μηδενικό Caption: > BOOL CALLBACK EWProc(HWND hWnd,LPARAM lParam) { // Traverse all top-level windows DWORD dwPID; char szCaption[128] = ""; GetWindowThreadProcessId(hWnd,&dwPID); // Process IDs match if(dwPID==lParam) { // Check window title (caption) also! GetWindowText(hWnd,szCaption,sizeof(szCaption)); if(lstrcmp(szCaption,"optionsHWND")!=0 && lstrcmp(szCaption,"TrayMinimize")!=0 && lstrlen(szCaption)) { ShowWindowAsync(hWnd,_nCmdShow); _bSomethingFound = TRUE; } } // Continue list traverse return TRUE; } Στο παραπάνω if λέμε ότι: Εφαρμόσεις την ShowWindowAsync εάν το παράθυρο έχει τίτλο και δεν λέγεται optionsHWND ούτε TrayMinimize. Υ.Γ. Δημιούργησα ένα project στον C/C++ Builder με παρόμοιες φόρμες (μια Form1, μια optionsHWND, TrayMinimize και μια με κενό τίτλο) και φαίνεται ότι ο κώδικας δουλεύει σωστά σε αυτή την μικρή εξομοίωση. Ελπίζω να δουλέψει ικανοποιητικά και στο ίδιο το πρόγραμμα..
kath Δημοσ. 24 Μαΐου 2006 Μέλος Δημοσ. 24 Μαΐου 2006 Σε ευχαριστω πολυ για το χρονο σου , και ναι ο κωδικας δουλεψε! Ομως φιλε μη ζητας συγνωμη! αν ειναι δυνατον ! ........ Να'σαι καλα & ευχαριστω για το χρονο που αφιερωσες .. μονο και μονο για να βοηθησεις )!
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.