2

SetWindowRgn別のプロセスに属するウィンドウに透明な穴をあけるプログラムを書いています。(これは、ユーザーが明示的に要求した場合にのみ実行されます。)

プログラムは、ターゲット ウィンドウに保持する必要のある穴が既にある可能性があると想定する必要があるため、 を呼び出す前に を呼び出しSetWindowRgnGetWindowRgn現在の領域を取得し、現在の領域と新しい領域を結合して を呼び出しますSetWindowRgn

HRGN rgnOld = CreateRectRgn ( 0, 0, 0, 0 );
int regionType = GetWindowRgn ( hwnd, rgnOld ); 

これは XP では問題なく動作しGetWindowRgnますが、Vista では への呼び出しが失敗します。Aero をオフにして、スレッドの権限をSE_DEBUG_NAMEwithAdjustTokenPrivilegesに昇格させようとしましたが、どちらも役に立ちません。

GetLastError() は、GetWindowRgn に対して有効な値を返さないようです。あるマシンでは 0 を返し、別のマシンでは 5 (アクセスが拒否されました) を返します。

誰かが私が間違っていることを教えてくれますか、または別のアプローチを提案できますか?

4

4 に答える 4

12

ウィンドウリージョンがありますか? XP のほとんどのトップ レベル ウィンドウは、デフォルト テーマが角を丸くするためにそれらを使用するため、そうします。

リージョンをまだ設定しておらず、呼び出しが失敗した場合は、賢明なデフォルト (ウィンドウ四角形) を使用して、人生を台無しにしないでください。さて、SetWindowRgn()失敗したら…

于 2008-09-28T00:28:08.273 に答える
2

Vista では、管理者として実行されていないプロセスが別のプロセスからウィンドウをターゲットにするためには、次のことを行う必要があります。

  • uiAccess="true" でマニフェスト ファイルを埋め込みます (以下の例)。
  • アプリケーションにデジタル署名する
  • 「Program Files」などの「安全な」場所からインストールして実行します

サンプル マニフェストは次のとおりです。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <assemblyIdentity version="1.0.0.0" processorArchitecture="X86" name="yourAssemblyNameWithoutExtension" type="win32"/>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level="asInvoker" uiAccess="true" />
      </requestedPrivileges>
    </security>
  </trustInfo>
</assembly>
于 2008-09-28T18:19:36.997 に答える
1

Windows API 関数 ::GetWindowRgn(...) に関する私の答え (私の経験に基づく)

この関数は、Vista および Windows 7 では失敗します。つまり、ERROR が返されます。

ただし、この機能は Windows XP でうまく機能します。

したがって、次の複雑でない解決策をお勧めします。別の Windows で実行されることが予想されるアプリケーション内でこの関数を使用する場合は、次のようなテストを提供します。 int nResultOfRgnOperation = ::GetWindowRegion(...); if (nResultOfRgnOperation != ERROR) < この関数によって決定されたウィンドウ全体の領域をさらに使用する > else < ウィンドウ全体の境界四角形を見つけて、ウィンドウの領域の代わりにその境界四角形をさらに使用します。必要に応じて、境界の四角形を表す四角形の領域を作成できます。>

上記の <...> でマークされた場所で、対応するコードを使用してください。

熱意ありがとうございます。


于 2011-08-25T03:15:06.903 に答える
1

別のプロセスのウィンドウの領域を取得しようとしていると述べています。Vista は、多数のクロスプロセス Win32 呼び出しのセキュリティを強化しました。のドキュメントは見つかりませんがGetWindowRgn()、簡単にテストできます。独自のリージョンを設定する単純なプロジェクトを作成し、元のアプリを使用して単純なアプリのリージョンを取得してみてください。それが機能する場合、それは面倒なことになり、人々はあなたのアプリを何にも使用できなくなります. それが機能しない場合、アプリが Vista でまったく機能しない可能性があります。

于 2008-09-28T00:52:30.820 に答える