Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπερα!

 

Φτιάχνω ένα προγραμματάκι σε C++ το οποιο μεσα απο τη διαδικασια EnumWindows βρίσκει ολα τα ενεργα μή κρυμενα παραθυρα σε περιβάλλον Windows. Μέσα απο αυτή τη διαδικασία θέλω να τσεκάρω εαν ένα συγκεκριμένο παράθυρο ειναι ανοιχτό. Στον παρακάτω κώδικα πως μπορω να ελέγξω αν το παραθυρο είναι ανοιχτο;

BOOL CALLBACK FindTheDesiredWnd(HWND hWnd, LPARAM lParam)
{
	TCHAR title[500];
	TCHAR test[500] = TEXT("WinLister");
        ZeroMemory(title, sizeof(title));
	
	GetWindowText(hWnd, title, sizeof(title) / sizeof(title[0]));
	if (IsWindowVisible(hWnd))
	
	if (lstrcmp(title, "WinLister") == 0)
	{
		wcout << TEXT("Window Found") << std::endl;
	}
	else{
		wcout << TEXT("Can't Find It ") << std::endl;
		}
	return TRUE;
}

int main() {
	EnumWindows(FindTheDesiredWnd, 0);
	cin.get();
	return 0;
}
  • Απαντ. 45
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Δημοσ.

Γιατί το σωτήριο έτος 2014 δεν έχει απολύτως κανένα νόημα να το παίζεις και καλά dual build. Άμα το build δεν είναι Unicode you are doing it wrong, αν είναι Unicode τότε TEXT και L είναι το ίδιο.

 

Στην προκειμένη από τη στιγμή που λέει wcout << TEXT() ήδη έχεις καταλάβει ότι το TEXT είναι "λάθος" γιατί εκτός Unicode καλή τύχη με το wcout.

 

Τώρα το wcout << TEXT() στο ίδιο πρόγραμμα μαζί με lstrcmp χωρίς TEXT()... δε βγάζει κανένα νόημα.

Δημοσ.

Γιατί το σωτήριο έτος 2014 δεν έχει απολύτως κανένα νόημα να το παίζεις και καλά dual build. Άμα το build δεν είναι Unicode you are doing it wrong, αν είναι Unicode τότε TEXT και L είναι το ίδιο.

Γιατί you are doing it wrong? Οι στείροι αφορισμοί και οι γενικεύσεις δεν είναι του τύπου μου.

 

Στην προκειμένη από τη στιγμή που λέει wcout << TEXT() ήδη έχεις καταλάβει ότι το TEXT είναι "λάθος" γιατί εκτός Unicode καλή τύχη με το wcout.

 

Τώρα το wcout << TEXT() στο ίδιο πρόγραμμα μαζί με lstrcmp χωρίς TEXT()... δε βγάζει κανένα νόημα.

Αυτό είναι σωστό, αλλά έχει να κάνει με το ότι ο φίλος όπως είπε μαθαίνει τώρα και υποθέτω πως δεν έχει καταλάβει ακόμα τα περί TEXT. Αυτό είναι διαφορετικό πράγμα από τις υπεραπλουστεύσεις περί "σωτήριων ετών" και τα "you are doing it wrong".

Δημοσ.

Τότε λυπάμαι αλλά θα πρέπει να μάθεις την απάντηση από αλλού. Στη συγκεκριμένη περίπτωση εγώ βαριέμαι να λέω αυτονόητα.

Δημοσ.

Γιατί you are doing it wrong? Οι στείροι αφορισμοί και οι γενικεύσεις δεν είναι του τύπου μου.

 

Συνήθως είναι όντως έτσι. Εδώ όμως έχει κανένα νόημα πια να μην χρησιμοποιείς UTF-8 ? (στην περίπτωση των windows UTF-16 ή ό,τι χρησιμοποιούν).

 

Θυμάμαι ένα πράγμα που με τσάτιζε στα windows ήταν ότι το notepad έσωζε από τη μάνα του σε iso (σε windows-1253 για την ακρίβεια).

 

Ποιος ο λόγος σήμερα να μην χρησιμοποιείς κάποια αναπαράσταση του unicode ? Στην συγκεκριμένη περίπτωση acked και από εμένα ο αφορισμός. Είτε γράφεις C ή κάποια ιστοσελίδα ή οτιδήποτε και δεν χρησιμοποιείς Unicode, πρέπει να βγαίνει ένα χέρι από το IDE και να σε σφαλιαρίζει :)

Δημοσ.

imitheos λόγω background σε linux υποψιάζομαι ότι δεν ξέρεις ακριβώς τι συνεπάγεται το TEXT().

 

Επι τροχάδην:

  • Η συμπεριφορά του TEXT() καθορίζεται από την ύπαρξη ή όχι του UNICODE (ή _UNICODE) macro όταν κάνεις build.
  • Ο λόγος ύπαρξης αυτού του macro είναι να επιλέγει ονόματα για κάποιες συναρτήσεις, π.χ. να γράφεις GetWindowText και να δουλεύει σωστά ενώ δεν υπάρχει function GetWindowText (υπάρχουν GetWindowTextΑ και GetWindowTextW και βέβαια παρόλο που δεν έχεις λόγο αν θες δε σε εμποδίζει κανείς να τις καλέσεις)
  • Ο λόγος που χρειάζεται αυτό το master switch και που υπάρχουν δύο ξεχωριστές συναρτήσεις για "τα πάντα" είναι ότι δεν υποστηρίζουν όλες οι πλατφόρμες τη -W μορφή. Συγκεκριμένα μιλάω για τις consumer εκδόσεις των Windows μέχρι και τα Windows Me που είναι τραγικές σ' αυτό το θέμα και για να γίνεις περίπου άνθρωπος εκεί πρέπει να εγκαταστήσεις στο σύστημα ένα compatibility layer.

Οπότε η απάντηση που ήθελε και ο migf1 είναι ότι δεν κάνεις unicode build στις εξής δύο περιπτώσεις:

  1. θέλεις το πρόγραμμά σου να τρέχει σε Win95/98/Me
  2. "είσαι τραγικός"

Δηλαδή δεν είναι καν θέμα του "πώς θέλεις να γράψεις το πρόγραμμά σου", αλλά καθαρά θέμα platform compatibility.

 

Στον κόσμο του migf1 μπορεί αυτό που είπα να είναι στείρο, υπεραπλούστευση, κλπ. Σεβαστή η άποψή του και αναμενόμενη, δεν είναι πρώτη φορά που κρίνει πράγματα για τα οποία δε γνωρίζει.

Δημοσ.

imitheos λόγω background σε linux υποψιάζομαι ότι δεν ξέρεις ακριβώς τι συνεπάγεται το TEXT().

Αυτό που είπα το είπα πιο πολύ γενικά για τη χρήση Unicode και όχι τόσο για το TEXT αυτό καθεαυτό. Όντως δεν έχω ιδέα τι συνεπάγεται σε Windows. Παλαιότερα είχα ασχοληθεί πολύ λίγο να κάνω ένα κώδικα να τρέχει σε windows και θυμάμαι ότι υπήρχαν κάτι wrappers (πχ tmain) τα οποία τα βάζεις και ανάλογα αν μιλάμε για unicode build ή όχι, μεταφράζονται στην αντίστοιχη έκφραση (όπως πχ σε posix το stat μεταφράζεται αυτόματα σε stat64 αν έχει οριστεί το απαιτούμενο macro).

 

Από αυτό ορμώμενος (και από το "αν είναι Unicode τότε TEXT και L είναι το ίδιο" που είπες) υπέθεσα ότι και το TEXT είναι κάποιο τέτοιο wrapper που ισοδυναμεί με L όταν μιλάμε για unicode και με κάτι legacy όταν δεν μιλάμε για unicode.

 

Επι τροχάδην:

Ευχαριστώ για την εξήγηση.

 

Οπότε η απάντηση που ήθελε και ο migf1 είναι ότι δεν κάνεις unicode build στις εξής δύο περιπτώσεις:

  • θέλεις το πρόγραμμά σου να τρέχει σε Win95/98/Me
  • "είσαι τραγικός"
Ίσως πω χαζομάρα αλλά υπάρχει ακόμη κοινό με Win98 ώστε να χρειάζεται να υποστείς κάποιο legacy υποδεέστερο API ?
Δημοσ.

Στον κόσμο του defacer δεν ξέρω τι ακριβώς γίνεται, ούτε με ενδιαφέρει κιόλας, αλλά στον δικό μου κόσμο με TEXT() και _tprintf() τυπώνω debugging messages στην κονσόλα των windows απροβλημάτιστα με 4 διαφορετικούς compilers, και όχι δεν θέλω να κάνω διαχείριση της κονσόλας με win32api calls επειδή έτσι του κάπνισε του defacer.

 

Επίσης, για όσους δεν είναι τραγικοί, ας το κάνουν με wchar_t στην κονσόλα των windows σε διάφορους compilers κι ας έρθουν μετά να μου πουν πως είναι τα πράγματα στον δικό τους κόσμο.

 

Όταν τελειώσει το debugging test, κάνω define τα _UNICODE/UNICODE και τελειώνει το παραμύθι... και άντε γεια...

Δημοσ.

Είναι γεγονός πως υπάρχει επιχείρημα για οτιδήποτε: επειδή κάνω τα πράγματα στραβά γιατί έτσι μου αρέσει, το στραβό είναι χρήσιμο.

 

Αυτό που δε μας εξήγησες είναι αν γεμίζεις και το πρόγραμμα με κώδικα που να μπορεί να διαχειριστεί και τις δύο περιπτώσεις (π.χ. τις διαφορές ανάμεσα σε LPCSTR και LPCWSTR που θα προκύψουν εξαιτίας αυτού που κάνεις) μόνο και μόνο για να μπορείς να κάνεις debugging με _tprintf (lol) (αλήθεια η σκέτη printf δε σου κάνει είπαμε γιατί?) χωρίς να είσαι αναγκασμένος από τη σκληρή μοίρα να χρησιμοποιήσεις win32 api calls... στο win32 πρόγραμμά σου. Το οποίο κάνεις compile με 4 διαφορετικούς compilers γιατί αυτό έχει νόημα, μπορεί ο πελάτης να ζητήσει ντε και καλά να είναι έκδοση από gcc, τι να του πεις όχι;

 

I really don't want to know βέβαια. Φαντάζομαι είσαι ο τύπος που στην PHP θα έλεγε ότι τα magic quotes και το register globals είναι καλά επειδή εσύ τα χρησιμοποιείς και κάνεις τη δουλειά σου πιο εύκολα από τα υπόλοιπα κορόιδα που γράφουν κώδικα φορώντας παρωπίδες.

 

PS: Για το crtdbg.h έχεις ακουστά; Δουλεύει και σε non-win32 projects.

Δημοσ.

Είναι γεγονός πως υπάρχει επιχείρημα για οτιδήποτε: επειδή κάνω τα πράγματα στραβά γιατί έτσι μου αρέσει, το στραβό είναι χρήσιμο.

 

Αυτό που δε μας εξήγησες είναι αν γεμίζεις και το πρόγραμμα με κώδικα που να μπορεί να διαχειριστεί και τις δύο περιπτώσεις (π.χ. τις διαφορές ανάμεσα σε LPCSTR και LPCWSTR που θα προκύψουν εξαιτίας αυτού που κάνεις) μόνο και μόνο για να μπορείς να κάνεις debugging με _tprintf (lol) (αλήθεια η σκέτη printf δε σου κάνει είπαμε γιατί?) χωρίς να είσαι αναγκασμένος από τη σκληρή μοίρα να χρησιμοποιήσεις win32 api calls... στο win32 πρόγραμμά σου. Το οποίο κάνεις compile με 4 διαφορετικούς compilers γιατί αυτό έχει νόημα, μπορεί ο πελάτης να ζητήσει ντε και καλά να είναι έκδοση από gcc, τι να του πεις όχι;

 

I really don't want to know βέβαια. Φαντάζομαι είσαι ο τύπος που στην PHP θα έλεγε ότι τα magic quotes και το register globals είναι καλά επειδή εσύ τα χρησιμοποιείς και κάνεις τη δουλειά σου πιο εύκολα από τα υπόλοιπα κορόιδα που γράφουν κώδικα φορώντας παρωπίδες.

 

PS: Για το crtdbg.h έχεις ακουστά; Δουλεύει και σε non-win32 projects.

Άστο ρε αγόρι μου, αφού δεν σου βγαίνει... γιατί το συνεχίζεις; Αν έχεις γράψει έστω και 10 γραμμές κώδικα με Win32 API εγώ είμαι ο Λουδοβίκος ο 14ος. Μην παίρνεις στο λαιμό σου νέα παιδιά που θέλουν να γνωρίζουν όλες τις επιλογές που έχουν διαθέσιμες και που δεν είναι υποχρεωμένα να ακολουθήσουν τον δικό σου δρόμο (ευτυχώς).

 

Όσο για την printf() αν εσύ τη βρίσκεις να μετατρέπεις χειροκίνητα wchar_t σε chars, μόνο και μόνο για να τα τυπώσεις στην κονσόλα των Windows επειδή σου είπανε πως το TEXT() είναι last year, με γεια σου και χαρά σου. Αλλά είπαμε (είπες δηλαδή) δεν είναι η 1η φορά που συμμετέχω σε νήμα χωρίς να ξέρω τι μου γίνεται, οπότε πάρε τη σκυτάλη εσύ από εδώ και πέρα και φώτισε τον κόσμο με τις Win32 API γνώσεις σου.

 

Εγώ τέρμα.

Δημοσ.

Παιδιά να ξέρετε, δε θέλω να σας πάρω στο λαιμό μου. Πρέπει να γνωρίζετε όλες τις επιλογές. Για παράδειγμα, δε χρειάζεται να κάνετε τον πολλαπλασιασμό όπως σας μαθαίνουν στο σχολείο αυτοί που θέλουν το κακό σας. Μπορείτε π.χ. να τον κάνετε με αλλεπάλληλες προσθέσεις.

 

Pathetic.

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...