10

Windows 7 (x64) および Windows 8 (x64) の C++ でTeamViewerのようなリモート デスクトップ アプリケーションを作成しています。

1.何が私を行き詰まらせたのか

SendInput() を使用して、マウス入力とキーボード入力を実装しました。プロセスが下で実行されたときに SendInput() が完全に機能することがわかりましたwinsta0\desktop。しかし、ユーザーがコンピューターをロックしたり、スクリーンセーバーが起動したりした後は、機能しませんでした。

でプロセスを実行するとwinsta0\winlogon、 ではSendInput()動作しませんwinsta0\default

2.試したこと

SetThreadDesktop() を使用してプロセスを から に切り替えようとしwinsta0\desktopましwinsta0\winlogonたが、エラー 170: "要求されたリソースは使用中です" が発生し、スタックしました。

3. 知りたいこと

TeamViewer_Desktop.exeTeamViewer には、 Winlogon、Default、および Screensaver の下でマウスとキーボードを制御できるという名前のプロセスがあることに気付きました。それはどのように行うのですか?

私の質問を解決する方法を理解するのに役立つコードを提供できますか?

アプリケーションで既定のデスクトップと Winlogon デスクトップを切り替える方法を知りたい**。そのため、セキュリティで保護されたデスクトップでマウスとキーボードを制御できますwinlogon.exe

4

2 に答える 2

8

あなたは正しいことをしました:SetThreadDesktop正しいです。このエラーは、ウィンドウなど、現在のデスクトップでいくつかのリソースを開いているため、切り替えることができないことを示しています。最小限のテスト ケースを作成しようとしていた場合 (ここで質問するときに行うように意図されています!)、それを発見したでしょう。

デスクトップの切り替えを妨げているチャンクが見つかるまで、プログラムの一部を切り取ります。一部の Windows API は厄介で、デスクトップの切り替えを妨げているため、専用スレッドで呼び出す必要があります。

于 2013-04-15T09:19:52.637 に答える