2017-08-24 2 views
-1

Faire une injection dll et besoin de détruire une certaine fenêtre. Cependant, DestroyWindow ne fonctionne que si le même thread qui a créé la fenêtre l'appelle. Sinon, il échoue avec l'erreur 5: Accès refusé. J'ai pensé que peut-être je pourrais l'amener à penser que j'étais le thread de création en obtenant l'identifiant de thread (DWORD dwTid = GetWindowThreadProcessId), puis en définissant l'ID de thread du thread en cours: __writefsdword(0x24, dwTid) mais il échoue toujours avec l'erreur 5, Accès refusé.Comment détruireWindow à partir de thread à distance?

Après quelques recherches, je n'ai pas encore trouvé de réponse.

BTW: Je suis conscient que je pourrais envoyer WM_DESTROY Cependant, par curiosité et la nécessité de résoudre des problèmes, je veux savoir comment le faire avec DestroyWindow.

+5

Avez-vous essayé de poster WM_CLOSE dans la fenêtre? – Robinson

+0

"BTW: Je suis conscient que je pourrais envoyer WM_DESTROY cependant, par curiosité et le besoin de résoudre des problèmes, je veux savoir comment le faire avec DestroyWindow." - Y compris WM_CLOSE. Désolé, aurait dû être plus précis. –

+0

Je ne suis pas sûr des problèmes que vous avez besoin de résoudre qui vous obligent à faire quelque chose de simple et direct d'une manière compliquée. Peut-être pouvez-vous expliquer le problème que vous essayez de résoudre et nous pouvons vous aider à trouver des solutions à ce problème? – Basya

Répondre

5

Pour appeler DestroyWindow(), vous devez injecter du code qui s'exécute dans le contexte du thread qui a créé la fenêtre. Utilisez GetWindowThreadProcessId() pour obtenir l'ID de thread propriétaire de la fenêtre, puis installez un message dans ce fil en utilisant SetWindowsHookEx(), puis envoyez/envoyez un message à la fenêtre. Lorsque le rappel de hook reçoit le message, il sera exécuté dans le contexte du thread de la fenêtre, et peut donc appeler DestroyWindow() sur la fenêtre (le HWND est fourni au rappel de hook).