好吧,我有以下问题:
根据一些布尔变量,我用不同的颜色绘制了树细胞。例子:
- isProcessService,
- isProcessInDebugger,
- isProcessService,
- isProcessElevated,
- 是ProcessNet,
- isProcessOwner,
- isProcessinJob,
- isProcessPacked,
- isProcessMarkedForDeletion,
- isProcessMarkedForCreation : 布尔值;
因此,在 BeforeCellPaint 中,我将根据这些布尔值绘制单元格背景颜色,例如:
过程 TMainForm.ProcessVstBeforeCellPaint(发件人:TBaseVirtualTree;
目标画布:TCanvas;节点:PVirtualNode;列:TColumnIndex;
CellPaintMode:TVTCellPaintMode;单元格矩形:TRect;var ContentRect: TRect);
变量
节点数据:PProcessData;
开始
如果节点 = nil 则
出口;
NodeData := Sender.GetNodeData(Node);
如果 NodeData = nil 则
出口;
如果 (NodeData^.isProcessOwner) 那么
开始
TargetCanvas.Brush.Color := $00AAFFFF;
TargetCanvas.FillRect(TargetCanvas.ClipRect);
结尾;
if (NodeData^.isProcessInDebugger) 那么
开始
TargetCanvas.Brush.Color := $00E5A5A5;
TargetCanvas.FillRect(TargetCanvas.ClipRect);
结尾;
如果 (NodeData^.pProcessID = 0) 或 (NodeData^.pProcessID = 4) 那么
开始
TargetCanvas.Brush.Color := $00FFCCAA;
TargetCanvas.FillRect(TargetCanvas.ClipRect);
结尾;
如果 (NodeData^.isProcessElevated) 而不是 (NodeData^.isProcessInDebugger) 那么
开始
TargetCanvas.Brush.Color := $0000AAFF;
TargetCanvas.FillRect(TargetCanvas.ClipRect);
结尾;
if (NodeData^isProcessService) 和
不是 (NodeData^.isProcessPacked) 和
不是(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);
结尾;
如果 (NodeData^.isProcessNet) 那么
开始
TargetCanvas.Brush.Color := $005CE0BF;
TargetCanvas.FillRect(TargetCanvas.ClipRect);
结尾;
结尾;
问题是:
如何根据要创建或删除的进程将单元格涂成绿色或红色(让颜色保持至少一秒钟,然后切换回其原始值?)
换句话说,创建了一个进程,将单元格涂成绿色,稍等片刻,然后切换回原始颜色,具体取决于:isProcessService、is ProcessOwner 等等...
最大的问题是我在非阻塞模式下需要这个(我不能使用睡眠,否则树也会冻结,所以颜色变化不会被注意到)
如果您仍然无法关注我,我正在尝试模仿 Process Explorer 或 Process Hacker 在创建或删除进程时所做的相同行为。这两个应用程序都将这些进程的单元格背景涂成红色或绿色一秒钟,然后切换回单元格的原始颜色。
仅供参考,我将通过 wmi 收到有关进程创建或删除的通知。