環境: Windows10 IoT 2016 LTSB 64bit
[Q1]
Windows10で同時に存在する別プロセスのウィンドウハンドルの値がかぶることがありえるのか確認させてください。
問い合わせする先の別プロセスのプロセスIDを取得するのにHWNDで検索しており、そのHWNDはその別プロセスのクラス名とWindowTitleで検索しています。
ログで確認していますとそのHWNDが自プロセスのHWNDと同じ値となってしまっていて、問い合わせ先が自プロセスとなり値が取得できずエラーしているとのことです。
そのため、同時に存在しているプロセスでHWNDの値が同じ値になってしまうようなことはありえるのかどうか知りたいです。
なお、自プロセスはサービスプロセス(セッション0)で、問い合わせ先のプロセスはウィンドウアプリケーション(セッション1)だという点です。
[A1]
ウィンドウハンドルはセッション毎に管理されており、セッションが異なる場合同じウィンドルハンドルの値がセットされる可能性があります。
そのため、ウィンドウハングが同じであることで問題になっているケースがある場合には、アプリケーション側にてセッションも同じかどうか判断するロジックを追加頂くようご検討お願いします。
[Q2]
ウィンドウハンドルが被っている環境で、ウィンドウハンドルからプロセスIDを検索した際には、必ず検索を実行したプロセスと同じセッションのプロセスのIDが返ってくるという認識でよろしいでしょうか?
[A2]
基本的には検索はそのデスクトップに属する全ウィンドウハンドル内から検索され、これはそのセッション内のウィンドウからのみ検索することを意味します。
そのため「はい」となります。
[Q3]
APIとして、現在の実装は下記となります。
HWND hwnd = ::FindWindow(lpClassName, lpWindowName);
DWORD dwWndThreadId = ::GetWindowThreadProcessId(hwnd, &dwProcessId);
[A3]
FindWindow() は FindWindow が実行されているセッション内からlpWindowName の名前のウィンドウを検索致します。
また、GetWindowThreadProcessId はそのプロセスの中からHwnd に合致する window thread を検索します。
そして、プロセスは何らかのセッションに属しており、PID で指定されたプロセスが属しているセッションかつそのプロセス内の window thread が返されます。
ご記載のコードがSession 0 のサービスから実行されており、dwProcessId で指定される PID のプロセスが Session 1 で動作しているということでしょうか。
この場合、FindWindow() は正しくウィンドウハンドルを返しますでしょうか。
実コードで確認をさせて頂いているわけではございませんが、仮に Session 0 から FinWindows() して正しく値が戻る場合、全セッションのウィンドウ情報から検索している可能性があり、この場合、戻ってきたウィンドウハンドルを保持するプロセスが動作しているセッションを意識してコーディング頂く必要がございます。