3

コントロールがエンド ユーザーに表示されるかどうかを議論しているクラッシュダンプを取得しました。!do を見ると、Visible プロパティと一致する true/false 値を保持する明示的なフィールドが見当たりません。これは、おそらく win32 領域でダウンしているため、それほど驚くことではありません。Visible がダンプ ファイルから何を返すかを推測する方法を知っている人はいますか?

ありがとうオスカー

4

1 に答える 1

4

私の最初の考えでは、これは正しいフィールドを調べるだけの問題でしたが、実際にはもう少し掘り下げる必要がありました。Reflector の Control を見ると、Visible プロパティが GetVisibleCore を呼び出していることがわかります。これは、内部状態フィールドを値 2 (たまたま定数 STATE_VISIBLE) に対してチェックします。

したがって、コントロールが表示されているかどうかを確認するには、状態フィールドを見つけてビット操作を行う必要があります。

インスタンスのアドレスがわかっている場合は、次のことができます。

.shell -ci "!do <ADDRESS>" grep state   (use findstr, if you don't have grep)

出力はこれに似たものです

0:000> .shell -ci "!do 015892a4" grep state
03aeedcc  400112c       4c         System.Int32  1 instance 17432589 state  <=== HERE!
03aeedcc  400112d       50         System.Int32  1 instance     2060 state2
049ac32c  40011ef       d0 ...lized.BitVector32  1 instance 01589374 state
03aeedcc  40011f0      ad4         System.Int32  1   static        1 stateScalingNeededOnLayout
03aeedcc  40011f1      ad8         System.Int32  1   static        2 stateValidating
03aeedcc  40011f2      adc         System.Int32  1   static        4     stateProcessingMnemonic
03aeedcc  40011f3      ae0         System.Int32  1   static        8 stateScalingChild
03aeedcc  40011f4      ae4         System.Int32  1   static       16 stateParentChanged

2 つの状態フィールドがあることに注意してください。なぜそうなのかは調べていませんが、必要なのは System.Int32 です。私の例では、値は 17432589 です。

GetState のコードは次のとおりです。

return ((this.state & flag) != 0);

ここから行う必要 (17432589 & 2) != 0があるのは、特定のインスタンスの Visible 状態を取得することだけです。

実際には、さらに一歩進める必要があるかもしれません。上記が false を返す場合は、親を調べて、トリックを繰り返す必要があります。必要のないフォームを使用した私の簡単な例について。

于 2009-10-26T08:05:02.083 に答える