さて、次の問題があります。
いくつかのブール変数に応じて、ツリー セルをさまざまな色でペイントしました。例:
- 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 経由でプロセスの作成または削除の通知を受け取ります。