5

さて、次の問題があります。

いくつかのブール変数に応じて、ツリー セルをさまざまな色でペイントしました。例:

  • isProcessService、
  • isProcessInDebugger、
  • isProcessService、
  • isProcessElevated、
  • isProcessNet、
  • isProcessOwner、
  • isProcessinJob、
  • isProcessPacked、
  • isProcessMarkedForDeletion、
  • isProcessMarkedForCreation : ブール値;

したがって、BeforeCellPaint では、次のようなブール値に基づいてセルの背景色をペイントします。

手順 TMainForm.ProcessVstBeforeCellPaint(送信者: TBaseVirtualTree;
  TargetCanvas: TCanvas; ノード: PVirtualNode; 列: TColumnIndex;
  CellPaintMode: TVTCellPaintMode; CellRect: TRect; var ContentRect: TRect);
変数
  ノードデータ: PProcessData;
始める
 ノード = nil の場合
    出口;

  NodeData := Sender.GetNodeData(ノード);

  NodeData = nil の場合
    出口;

  if (NodeData^.isProcessOwner) then
  始める
    TargetCanvas.Brush.Color := $00AAFFFF;
    TargetCanvas.FillRect(TargetCanvas.ClipRect);
  終わり;

  if (NodeData^.isProcessInDebugger) then
  始める
    TargetCanvas.Brush.Color := $00E5A5A5;
    TargetCanvas.FillRect(TargetCanvas.ClipRect);
  終わり;

    (NodeData^.pProcessID = 0) または (NodeData^.pProcessID = 4) の場合
  始める
    TargetCanvas.Brush.Color := $00FFCCAA;
    TargetCanvas.FillRect(TargetCanvas.ClipRect);
  終わり;

  (NodeData^.isProcessElevated) かつ not(NodeData^.isProcessInDebugger) の場合
  始める
    TargetCanvas.Brush.Color := $0000AAFF;
    TargetCanvas.FillRect(TargetCanvas.ClipRect);
  終わり;

  if (NodeData^isProcessService) および
    (NodeData^.isProcessPacked) ではなく、
    not(NodeData^.isProcessNet) の場合
  始める
    TargetCanvas.Brush.Color := $00FFFFCC;
    TargetCanvas.FillRect(TargetCanvas.ClipRect);
  終わり;

  (NodeData^.isProcessMarkedForDeletion) の場合
  始める
    TargetCanvas.Brush.Color := $005D5DFF;
    TargetCanvas.FillRect(TargetCanvas.ClipRect);
  終わり;

  (NodeData^.isProcessMarkedForCreation) の場合
  始める
    TargetCanvas.Brush.Color := $0061E15E;
    TargetCanvas.FillRect(TargetCanvas.ClipRect);
  終わり;

  if (NodeData^.isProcessNet) then
  始める
    TargetCanvas.Brush.Color := $005CE0BF;
    TargetCanvas.FillRect(TargetCanvas.ClipRect);
  終わり;
終わり;


質問は:

プロセスが作成または削除されるかどうかに応じて、セルを緑または赤にペイントするにはどうすればよいですか (色を少なくとも 1 秒間そのままにしてから、元の値に戻しますか?)

つまり、プロセスが作成され、セルが緑色にペイントされ、しばらく待ってから、isProcessService、is ProcessOwner などに応じて元の色に戻ります...

最大の問題は、非ブロック モードでこれが必要なことです (スリープを使用できません。そうしないと、ツリーもフリーズするため、色の変化が認識されません)。

それでもフォローできない場合は、プロセスが作成または削除されたときに Process Explorer または Process Hacker が行うのと同じ動作を模倣しようとしています。どちらのアプリケーションも、これらのプロセスのセルの背景を赤または緑で 1 秒間ペイントしてから、セルの元の色に戻します。

参考までに、wmi 経由でプロセスの作成または削除の通知を受け取ります。

4

1 に答える 1

5

プロセスが作成されるたびに、そのプロセスに関連付けられたタイマーを 1 秒のタイムアウトで開始します。が true に設定されているisProcessMarkedForCreationため、行は緑色に塗られています。タイマーが起動すると、ハンドラーisProcessMarkedForCreationが false に設定され、その行の再描画が強制され、緑色のハイライトが削除されます。タイマーの作業が完了したので、削除する必要があります。削除にもまったく同じアプローチを使用できます。

于 2011-07-04T09:12:11.287 に答える