2010-11-30 6 views
1

J'ai une application Delphi qui tente d'ouvrir une webcam. Sous Windows 7 it fails de temps en temps (c'est une autre histoire/question/thread) mais le pilote de la webcam apparaît également une boîte de dialogue intitulée "Video Source" m'invitant à en sélectionner un. Si j'essaie d'ouvrir le pilote à plusieurs reprises en boucle et que je ferme manuellement la boîte de dialogue à chaque fois qu'elle apparaît, je peux y arriver. Donc, je voudrais fermer la boîte de dialogue de mon application. Un FindWindow (nil, 'Video Source') ne le trouve pas. Si je regarde avec l'explorateur de processus la boîte de dialogue est montrée comme appartenant à mon application. Si je force la fermeture de PE cela ferme mon application! Comment fermer cette boîte de dialogue? J'ai un soupçon (confirmé) que mon application est suspendue alors que cette boîte de dialogue est ouverte, ce qui rend très difficile l'exécution de tout code pour fermer la boîte de dialogue.obtenir une application Delphi pour fermer une boîte de dialogue qui a surgi d'un pilote

Répondre

1

Si votre thread d'application principal est bloqué en attente d'une entrée de l'utilisateur en raison de cette boîte de dialogue contextuelle, la seule solution est d'avoir un autre thread qui tente régulièrement de localiser ce popup. Quand il le trouve, alors utilisez PostMessage pour utiliser un WM_CLOSE ou similaire à la poignée contextuelle. Vous devrez peut-être envoyer des messages mousedown/mouseup au bouton de la fenêtre contextuelle. En outre, j'écrirais une petite application de débogage qui utilise Windows API WindowFromPoint pour découvrir la fenêtre contextuelle, c'est-à-dire. pas seulement une légende visible mais aussi une classe. Vous pouvez également utiliser ce programme de débogage pour que FindWindow fonctionne correctement.

+0

Vous pouvez également utiliser WinSpy ou Spy ++ pour obtenir des informations à son sujet, y compris sa classe. Pas besoin d'écrire votre propre application pour le faire. –

+0

Le thread principal était bloqué mais les événements du temporisateur étaient toujours déclenchés. A écrit un rapide et sale pour énumérer toutes les fenêtres et sur la base de ce que j'ai appris j'ai ensuite ajouté 1 sec minuterie de routine à mon application qui cherchait class = '# 32770' et title = 'Video Source', puis émis un WM_CLOSE. Cela en conjonction avec une boucle pour réessayer l'ouverture m'a fait aller, mais ce n'est pas très joli. Semble être un problème connu avec Windows 7. – rossmcm

Questions connexes