3

編集:明確にするために編集しました

単一のメイン ウィンドウを持つ GUI アプリケーションがあります。そのメイン ウィンドウのタイトル バーにはテキストがあります。メイン ウィンドウのタイトル バーのテキストを取得するように依頼されました。

通常、ユーザーがログインしている場合、アプリケーションは問題なく起動し、PowerShell を使用して System.Diagnostic.Process.MainWindowTitle を呼び出してメイン ウィンドウのタイトルを取得できますが、問題ありません。

ただし、ユーザーがログインしていないときは、これと同じ情報を取得する必要があります。そのために、タスク スケジューラによって起動されるスクリプトまたは小さなコンソール アプリケーションを作成するつもりでした。奇妙なことに、システムにログオンしているユーザーがいないときにこのアプリケーションを起動し、唯一のメイン ウィンドウのタイトル バーのテキストを取得する必要があります。

ユーザーがログインしていない場合でも、タスク スケジューラはスクリプトや実行可能ファイルを忠実に実行しようとします。ただし、ユーザーがログに記録されていないため、これらのスケジュールされた実行可能ファイルまたはスクリプトは、Windows GUI サブシステムにアクセスできません。したがって、スケジュールされたタスクがウィンドウの描画を必要とするアプリケーションを起動しようとしても、そのウィンドウは描画されません。

つまり、この GUI アプリケーションを起動し、タイル バーにテキストを取得してからアプリケーションを強制終了するスクリプトを単純にスケジュールすることはできません (アプリケーションにはメイン ウィンドウが描画されないため、これを行うことはできません)。

私にはいくつかのアイデアがあり、それらに関する意見 (または別の選択肢) を期待していました。

  • 最も簡単ですが、最も望ましくない方法として、(実際のユーザーがいない場合でも) ユーザー ログオンを強制しようとします。これにより、 GUI サブシステムがロードされ、メイン ウィンドウが表示されます。メイン ウィンドウのタイトルのテキストを取得したら、もう一度ログオフします。

  • ある時点で、アプリケーションは何らかの Windows API を呼び出して、ウィンドウを描画するように要求します (前述のGUI サブシステムがないため、ウィンドウは描画されません)。このリクエストを何らかの方法でキャプチャでき、このリクエスト内でメイン ウィンドウのタイトルを見つけることができるでしょうか。または、メモリ内を指すポインターですか?何か?

  • これは実行可能性が低いようですが、マシン自体に RDP を確立できるかもしれません。私の考えでは、たとえば、ヘッドレス サーバーに RDP を接続すると、サーバーはクライアントに送り返す視覚要素を生成します。したがって、RDP 接続が確立されると、送り返す必要のある要素を描画するために、 GUI サブシステムがアクティブになっている必要があります。私の場合、要素はどこにも送信されませんが、ウィンドウのテキストを取得できるように要素が作成されることを願っています。

最後に、コンパイル時にバイナリに格納されたメイン ウィンドウ タイトルから情報を見つけることを期待して、文字列のバイナリを既に解析しようとしたことを明記したいと思います。ただし、一貫して使用できるほど信頼性は高くありません。

誰かが実際にこの壁のテキストの終わりに到達した場合は素晴らしいです。どの言語でもソリューションを提供しますが、C++ と C# が得意です。

4

1 に答える 1