好吧,我有以下问题:
根据一些布尔变量,我用不同的颜色绘制了树细胞。例子:
- 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 收到有关进程创建或删除的通知。