Fermer une fenêtre Windows

levresse Messages postés 2 Date d'inscription dimanche 18 février 2018 Statut Membre Dernière intervention 22 janvier 2023 - Modifié le 22 janv. 2023 à 18:07
JeuDuTaquin Messages postés 249 Date d'inscription mardi 4 juillet 2017 Statut Membre Dernière intervention 31 mai 2023 - 23 janv. 2023 à 02:58

  Bonjour,

Je suis nouveau sur le forum, alors soyez indulgent, merci 

Voila j'ai développé un petit programme en RapidQ, c'est du basic qui est très similaire à Visual basic, donc pas de problème pour moi pour comprendre le Visual Basic.

J'ai remarqué que certaine fenêtre de Windows XP  ne veulent plus se fermer quand on appui sur le bouton prévu à cette effet, si j’appuie sur ctrl+Alt+Suppr


j'ai une boite de dialogue qui apparait avec tout les programmes qui son chargé, mais impossible de voir ma fenêtre qui ne veut pas se fermer.....

J'ai donc développé un petit programme on me servant des API de Windows XP pack 3, pour essayer de remédier à se problème.

Malheureusement je n'y arrive pas, j'arrive à récupérer le titre, la class, le handle,  mais les fenêtres toutes simple ne veulent pas se fermer

Voici une partie du code allégé, c'est pour éviter de se perde dans les détailles et essayer de résoudre le problème, si vous le voulez avec code + compilation, je le mets ici.

$Include "Rapidq.inc"

TYPE POINTAPI
  X AS LONG
  Y AS LONG
END TYPE

Declare Function SendMessageA Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Long) As Long
Declare Function GetAsyncKeyState Lib "user32" alias "GetAsyncKeyState" (vKey As Long) As long
Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Declare Function CloseHandle Lib "kernel32" Alias "CloseHandle" (ByVal hObject As Long) As Long
Declare Function GetCursorPos Lib "user32" Alias "GetCursorPos" (lpPoint As POINTAPI) As Long


  Dim Handle as integer
  Dim Utiliser as integer
  
   Dim Souris AS POINTAPI

  Const WM_SETFOCUS As Long = &H7
  Const WM_CLOSE As Integer = &H10
  Const PROCESS_ALL_ACCESS As Long = &H1F03FF

     Utiliser = 1 : VK_RBUTTON = 2 : VK_LBUTTON = 1 : Touche = 65
           
    ClassNom$ = Space$(100)  
   
    Titre$ = space$(100)
   
   do
     GetCursorPos(Souris)
     LenClass = GetClassName(Handle,@ClassNom$,100)
     LenTitre = GetWindowText(Handle,@Titre$, 100)

     Edit1.text = left$(Titre$,LenTitre)
     Edit2.text= str$(Handle)
     Edit3.text = left$(ClassNom$,lenClass)

  If  GetAsyncKeyState(VK_RBUTTON) <>  0 then
      SendMessageA(Handle,WM_CLOSE,0,0)
      CloseHandle(Handle)   
    elseif GetAsyncKeyState(Touche) <> 0 then
        Utiliser = 0
    end if

    loop until Utiliser = 0

 J'utilise la fonction  SendMessageA(Handle,WM_CLOSE,0,0) pour essayer de fermer la fenêtre, j'ai des trucs qui disparaitre, mais pas la fenêtre.

   Avez vous une idée, ou une solution avec un API ?

  Merci pour ceux qui pourrons m'aidez

3 réponses

JeuDuTaquin Messages postés 249 Date d'inscription mardi 4 juillet 2017 Statut Membre Dernière intervention 31 mai 2023 7
Modifié le 22 janv. 2023 à 12:04

Salut et bienvenue sur ce forum,

Réponse:

Private Sub Form_Load()
Unload Me
End Sub

Donc, si j'ai bien compris, tu ouvres le "Gestionnaire de tâches" Windows pour fermer tes fenêtres...

Tu te prends la tête.

Dans une Fonction ou une sub, tu peux utiliser "STOP" (pause) ou "END" pour quitter ton programme.

Si ta fenêtre ne se ferme pas, c'est qu'un "tread" (hook sur un fichier data) n'est pas fermé avec un "RESET", ou si tu as une boucle infinie dans ton code.

Ctrl+Break (touche PRINT) ou Fn+Ctrl+P ferme une fenêtre avec un code circulaire en deboguage.

Amuse toi bien.

0
levresse Messages postés 2 Date d'inscription dimanche 18 février 2018 Statut Membre Dernière intervention 22 janvier 2023
22 janv. 2023 à 19:17

Bonjour,

Merci pour ton accueille,

Donc, si j'ai bien compris, tu ouvres le "Gestionnaire de tâches" Windows pour fermer tes fenêtres..

Pas du tout, ça serait trop simple...

Certaine fenêtre de Windows XP Pack 3 (oui je sais c'est vieux mais sa fonction encore très bien) son impossible

à fermer, c'est pour cela que j'ai développé ce petit programme.

Merci pour votre réponse

A+

.

0
JeuDuTaquin Messages postés 249 Date d'inscription mardi 4 juillet 2017 Statut Membre Dernière intervention 31 mai 2023 7
23 janv. 2023 à 02:58

Salut,

Malheureusement, il te sera difficile de solutionner ton problème avec ce genre de programmes.

La clôture impossible d'un fenêtre est le résultat d'un bogue des programmes concernés.

La pratique veut que le programme soit débogué à la source, et non par un programme tiers.

L'ouverture d'une fenêtre est gérée par une hiérarchie donnée par la configuration des fenêtres et par leurs déclaration d'appel.

Donc, si le tread de l'application chargée n'est pas mère, ou que la fenêtre esclave est bloquée sur une exécution extérieure... il te sera impossible de détécter la fenêtre et de la fermer.

J'ai été confronté à ce type de problème il y a quelques mois, et  bloquer une OCX classique type droplist est très facile!


Il sera possible de fermer l'application, mais la fenêtre en attente de la validation de l'OCX ne se fermera pas.

Il te faudra utiliser un programme qui efface les liens actifs ActiveX pour purger les fenêtres en attente de fermeture, j'ai eu ... mais j'ai plus.

Ceci est un cas particulier que j'ai expérimenté sur une action "droplist_change" qui bloquait sur une mise à jour du contrôle lors de l’exécution d'une routine.

Il faut donc que tu traces tes programmes, et que tu prennes soins à déboguer tes routines par masquage de codes sur les actions d'appel de tes contrôles. En les mettant en REM et en fermant l'application compilée... C'est la méthode que j'ai utilisée.

Certains bogues sont mesquins, et le cas évoqué m'a fait chercher longtemps.

Mais, en règle général, tout sub-classing et échange avec une OCX peut provoquer des interactions pouvant désorganiser celle-ci... d'où des plantages inexpliqués.

Tu nous propose de mettre le feu aux roues de ta voiture, au lieu de mettre une roue de secours.

Tes programmes n'ont pas un fonctionnement normal, il te faut donc les modifier.
Mais, la récurrence du problème laisse plus à penser à un problème systémique du compilateur et non à un bogue isolé.

Je pense plus à des DLLs, OCXs... non compatibles avec ton compilateur, qu'a un problème de programmation.

N'étant pas expérimenté en RapidQ, il m'est impossible de t'aider plus précisément dans ton problème.

Désolé...

0
Rejoignez-nous