2010-08-14 28 views
2

J'ai créé un économiseur d'écran (C#, .NET 4.0 si c'est important) mais j'ai quelques problèmes (à un niveau plus esthétique, cependant). Ceux-ci sont probablement faciles à résoudre, mais je n'ai pratiquement jamais utilisé l'API Win32, donc je peux facilement manquer l'évidence quand il s'agit de cela..NET: Propriétaire de la boîte de dialogue de configuration de l'économiseur d'écran et focus de l'aperçu

Q1: Je mis en place la petite fenêtre de prévisualisation comme ceci:

 
SetParent(Handle, hwndParent); 
SetWindowLong(Handle, GWL_STYLE, new IntPtr(GetWindowLong(Handle, GWL_STYLE) | WS_CHILD)); 
Rectangle parentRect; 
GetClientRect(hwndParent, out ParentRect); 
Size = parentRect.Size; 

hwndParent est analysé à partir du 2ème argument de commande. Le problème ici est que la fenêtre d'aperçu vole le focus de l'onglet des paramètres de l'économiseur d'écran. Comme une tentative naïve, j'ai appelé SetFocus(hwndParent) mais cela n'a eu aucun effet. Quelle est la bonne façon de garder la mise au point où il devrait être

Q2: Si j'ouvre la boîte de dialogue de configuration de la « manière habituelle » de créer une forme, à savoir

Application.Run(new ConfigurationForm());

la boîte de dialogue ne sera pas modal l'applet Panneau de configuration. Comment cela peut il etre accompli? J'ai compris que le HWND du parent prévu est fourni avec l'argument de la commande comme "/ c: nnnnnnnn" mais c'est aussi loin que je l'ai eu. (En utilisant SetParent(hwndParent) se comportait bizarrement donc ce n'est apparemment pas la bonne fonction.)

Répondre

0

Vous ne vérifiez pas les valeurs de retour sur vos appels d'API ... Je sais, j'ai aussi "emprunté" ce code à CodeProject, et c'est cassé dans Windows XP passé.

Votre appel à SetWindowsLong échoue, car une fois que vous avez modifié le parent de la fenêtre, vous ne pouvez plus le modifier. Si vous avez vérifié vos valeurs de retour et utilisé GetLastError, vous verrez que GetWindowLong et SetWindowLong échouent avec error = 5 (accès refusé).

J'ai corrigé cela en déplaçant l'appel à SetParent à APRÈS l'appel pour faire de la fenêtre une fenêtre enfant. Voir mon code sur dans cette question: Why won't the screen saver control panel kill my form when it dies?

Vous allez bientôt poser la question que j'ai posée là :-)