
Γράφω μια εφαρμογή που χρειάζεται για να φέρει το παράθυρο ενός εξωτερικού εφαρμογή στο προσκήνιο, και να μην κλέβουν απαραίτητα εστίαση (υπάρχει μια ρύθμιση από το χρήστη μπορεί να επιλέξει να κλέψουν / δεν κλέβουν εστίαση).


Ποιος είναι ο καλύτερος τρόπος να πάει για αυτό με τη χρήση του Win32 API; Έχω δοκιμάσει SetForeground (), αλλά κλέβει πάντα την εστίαση και δεν με συνέπεια λειτουργεί.


Ποιος είναι ο καλύτερος τρόπος να πάει για αυτό; Καμία ιδέα;

 
Φέρνοντας Παράθυρο στο Μέτωπο σε C # χρησιμοποιώντας τα Win32 API
=================================================================



SetForegroundWindow υποτίθεται ότι θα κλέψει την εστίαση και υπάρχουν ορισμένες περιπτώσεις όπου θα αποτύχει.



> 
> Η λειτουργία SetForegroundWindow βάζει το νήμα που δημιούργησε το καθορισμένο παράθυρο στο προσκήνιο και ενεργοποιεί το παράθυρο. εισαγωγής πληκτρολογίου κατευθύνεται προς το παράθυρο
> 
> 
> 


Δοκιμάστε τη λήψη της εστίασης με [SetCapture](http://msdn.microsoft.com/en-us/library/ms646262.aspx) πριν από την πραγματοποίηση της κλήσης. Επίσης εξετάσουμε διαφορετικούς τρόπους να φέρει το παράθυρο προς τα εμπρός: SetForeGroundWindow, SetActiveWindow, ακόμη και προσομοίωση ένα κλικ του ποντικιού μπορείτε να το κάνετε αυτό.

 

Μπορείτε να δοκιμάσετε τη λειτουργία BringWindowToTop να μην κλέψει την εστίαση. Δεν έχω χρησιμοποιήσει, αλλά φαίνεται να είναι αυτό που ψάχνετε.

 


> 
> Ποια είναι η διαφορά μεταξύ SetForeGroundWindow, SetActiveWindow και BringWindowToTop; Φαίνεται σαν να κάνουν όλοι το ίδιο πράγμα.
> 
> 
> 


Σύμφωνα με MSDN, SetForeGroundWindow θα ενεργοποιήσει το παράθυρο και άμεση εστίαση του πληκτρολογίου σε αυτό. Αυτό προσπαθεί να λειτουργήσει ακόμα και όταν η διαδικασία σας είναι στο παρασκήνιο. SetActiveWindow κάνει το ίδιο πράγμα όπως SetForeGroundWindow, αλλά δεν κάνει τίποτα αν η αίτησή σας δεν είναι η πιο μπροστά εφαρμογής. Τέλος, BringWindowToTop φέρνει μόνο το παράθυρο στην κορυφή, και δεν αλλάζει την εστίαση του πληκτρολογίου.

 

Έχετε δοκιμάσει τη χρήση SetWindowPos. Αυτή είναι η κανονική λειτουργία για τη μετακίνηση, αλλαγή μεγέθους και τη z-παραγγελίες των Windows. Υπάρχει μια σημαία SWP\_NOACTIVATE που μπορείτε να χρησιμοποιήσετε. Κοιτάξτε <http://msdn.microsoft.com/en-us/library/ms633545(VS.85).aspx> . Δεν έχω δοκιμάσει αυτό σε ένα παράθυρο που ανήκει σε μια άλλη διαδικασία, αλλά είναι πιθανόν να αξίζει μια δοκιμή.

 

SetWindowPos + SWP\_NOACTIVATE κάνει τη δουλειά του.

 

Θα μπορούσατε να χρησιμοποιήσετε FindWindow να πάρει το HWND του παραθύρου, στη συνέχεια, χρησιμοποιήστε τη λειτουργία BringWindowToTop βρέθηκε στο API του Win32.

 