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