2010-05-30 5 views
1

J'ai créé une petite application en C# qui supprime la bordure et la légende de la fenêtre, puis elle définit la taille de la résolution de l'utilisateur et la centre. C'est un utilitaire que j'utilise lorsque je veux jouer à des jeux en mode fenêtré sans être contrarié par les bordures. Tout fonctionne bien avec la plupart des jeux, mais j'ai essayé de l'utiliser sur un jeu Alpha Protocol récemment publié et cela ne fonctionne pas. Je pourrais presque dire que le jeu rétablit mes changements, mais je ne suis pas sûr de savoir si c'est vrai ou non. J'utilise les fonctions API importées MoveWindow, SetWindowLong et SetWindowPos.Supprimer WS_BORDER et WS_CAPTION de styles Windows ne fonctionne pas

Snippet:

Win32.MoveWindow(hWnd, 0, 0, Convert.ToInt32(sizeXText.Text), Convert.ToInt32(sizeYText.Text), true); 
Win32.SetWindowLong(hWnd, GWL_STYLE, Win32.GetWindowLong(hWnd, GWL_STYLE) & ~WS_CAPTION & ~WS_BORDER); 
Win32.SetWindowPos(hWnd, 0, 0, 0, 0, SWP_NOZORDER|SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE|SWP_DRAWFRAME); 

Répondre

1

Chaque fois que SetWindowPos est appelé, il envoie un message: WM_WINDOWPOSCHANGING à la fenêtre avec une copie accessible en écriture des paramètres SetWindowPos. Cela permet à la fenêtre de valider et de modifier les paramètres. De nombreuses fenêtres réagissent automatiquement au repositionnement et au dimensionnement pour gérer «intelligemment» leurs décorations non-clientes - ce qui, je pense, est ce qui se passe ici. Le code OnWindowPosChanging redéfinit les décorations non client juste avant le traitement de DRAWFRAME.

+0

J'ai trouvé: const UInt32 SWP_NOSENDCHANGING = 0x0400;/* Ne pas envoyer WM_WINDOWPOSCHANGING */ L'ajouter à SetWindowPos n'a cependant rien changé. Je suppose que SWP_DRAWFRAME est la partie cruciale de la fonction qui doit être exécutée afin de mettre à jour le cadre? Je pourrais essayer d'envoyer uniquement SendMessage sans SetWindowPos ... – JStrange

+0

Hm, on dirait que MoveWindow envoie aussi 'WM_WINDOWPOSCHANGING', donc si c'est vraiment le cas, le jeu intercepte le message, c'est ma seule chance de supprimer manuellement la bordure (via certaines fonctions de peinture)? – JStrange

+0

Presque n'importe quelle fonction qui est capable de déplacer ou de redimensionner ou de modifier la visibilité ou l'ordre z d'une fenêtre est finalement un wrapper autour de SetWindowPos. SetWindowPos envoie 'WM_WINDOWPOSCHANGING' et' WM_WINDOWPOSCHANGED' - qui sont gérés par la procédure de fenêtre par défaut qui les renvoie comme messages 'WM_GETMINMAXINFO',' WM_MOVE' et 'WM_SIZE'. Je m'attends à ce que le jeu traite au moins un de ces messages pour réinitialiser ses styles de trame. Si le message de changement est inhibé correctement, alors il est dans l'une des notifications modifiées. –

0

Vous devez utiliser Spy ++ pour étudier la structure de la fenêtre du jeu.

+0

J'utilise Winspector Spy et peut-être que je suis juste bête, mais je ne vois rien d'intéressant. Si j'utilise la fonctionnalité WS de l'édition des styles de fenêtres, elle se termine exactement de la même manière qu'avec mon application ... rien ne se passe. Voici une photo de WS: http://i47.tinypic.com/iypl5g.jpg – JStrange

Questions connexes