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

Δολοφονια παραθυρου :-) [C++]


kath

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

Δημοσ.

Δυστυχώς αυτό συμβαίνει διότι η ρουτίνα επιδρά πάνω σε όλα τα top-level παράθυρα της διεργασίας αφού όπως προείπα δεν έχω κάποιο άλλο στοιχείο (πχ. class name ή τυχόν windows properties κτλ.) πέραν του process id.

 

Αν από την άλλη πλευρά γνωρίζεις κάποια χαρακτηριστικά του παράθυρου που σε ενδιαφέρει μπορείς εύκολα να αυξήσεις με περισσότερους περιορισμούς την συνθήκη ελέγχου if(dwPID) ώστε τα αποτελέσματα να είναι λιγότερο ή καθόλου γενικά δηλαδή να μην επηρεάζονται όλα τα παράθυρα της διεργασίας.

Δημοσ.

Εμφανιζονται οι παρακατω φορμες :

 

1) Μια κενη ( που δεν υπαρχει στο project )

2) optionsHWND

3) TrayMinimize

 

Θα "παιξω" λιγο με τη ρουτινα ελεγχου , και βλεπουμε :)

Δημοσ.
Εμφανιζονται οι παρακατω φορμες :

 

1) Μια κενη ( που δεν υπαρχει στο project )

2) optionsHWND

3) TrayMinimize

 

Θα "παιξω" λιγο με τη ρουτινα ελεγχου ' date=' και βλεπουμε :)[/quote']

 

Δοκιμασα το παρακατω:

>
if((dwPID==lParam) && (dwPID!='TrayMinimize') && (dwPID!=' ') 
&& (dwPID!='optionsHWND') )

{
}

Αλλα δεν γινεται τιποτα......

Δημοσ.

Για να ελέγξουμε τον τίτλο (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;
}

Δημοσ.

Συγνώμη αλλά κατάλαβα αντίστροφα αυτό που ζητούσες (μου διέφυγε το != στις συνθήκες σου και το πέρασα για == :( :( :( ) , συνεπώς δοκίμασε τον παρακάτω κώδικα ο οποίος αυτή την φορά αγνοεί τα παραπάνω παράθυρα και εκείνο που έχει μηδενικό 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 και μια με κενό τίτλο) και φαίνεται ότι ο κώδικας δουλεύει σωστά σε αυτή την μικρή εξομοίωση.

 

Ελπίζω να δουλέψει ικανοποιητικά και στο ίδιο το πρόγραμμα..

Δημοσ.

Σε ευχαριστω πολυ για το χρονο σου , και ναι ο κωδικας δουλεψε!

Ομως φιλε μη ζητας συγνωμη! αν ειναι δυνατον :)!

 

........ Να'σαι καλα & ευχαριστω για το χρονο που αφιερωσες .. μονο και μονο για να βοηθησεις :))!

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...