У меня следующая проблема:
Я закрасил ячейки дерева в разные цвета в зависимости от некоторых булевых переменных. Пример:
Итак, в BeforeCellPaint я нарисую цвет фона ячеек на основе этих логических значений, например:
procedure TMainForm.ProcessVstBeforeCellPaint(Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; CellPaintMode: TVTCellPaintMode; CellRect: TRect; var ContentRect: TRect); var NodeData: PProcessData; begin if Node = nil then Exit; NodeData := Sender.GetNodeData(Node); if NodeData = nil then Exit; if (NodeData^.isProcessOwner) then begin TargetCanvas.Brush.Color := $00AAFFFF; TargetCanvas.FillRect(TargetCanvas.ClipRect); end; if (NodeData^.isProcessInDebugger) then begin TargetCanvas.Brush.Color := $00E5A5A5; TargetCanvas.FillRect(TargetCanvas.ClipRect); end; if (NodeData^.pProcessID = 0) or (NodeData^.pProcessID = 4) then begin TargetCanvas.Brush.Color := $00FFCCAA; TargetCanvas.FillRect(TargetCanvas.ClipRect); end; if (NodeData^.isProcessElevated) and not(NodeData^.isProcessInDebugger) then begin TargetCanvas.Brush.Color := $0000AAFF; TargetCanvas.FillRect(TargetCanvas.ClipRect); end; if (NodeData^isProcessService) and not (NodeData^.isProcessPacked) and not(NodeData^.isProcessNet) then begin TargetCanvas.Brush.Color := $00FFFFCC; TargetCanvas.FillRect(TargetCanvas.ClipRect); end; if (NodeData^.isProcessMarkedForDeletion) then begin TargetCanvas.Brush.Color := $005D5DFF; TargetCanvas.FillRect(TargetCanvas.ClipRect); end; if (NodeData^.isProcessMarkedForCreation) then begin TargetCanvas.Brush.Color := $0061E15E; TargetCanvas.FillRect(TargetCanvas.ClipRect); end; if (NodeData^.isProcessNet) then begin TargetCanvas.Brush.Color := $005CE0BF; TargetCanvas.FillRect(TargetCanvas.ClipRect); end; end;
Вопрос:
Как я могу окрасить ячейку в зеленый или красный цвет в зависимости от того, какой процесс будет быть создан или удален (пусть цвет останется хотя бы на одну секунду, а затем вернется к исходному значению?)
Другими словами, создается процесс, окрашивающий ячейку в зеленый цвет, подождите секунду, а затем переключитесь обратно на исходный цвет в зависимости от: isProcessService, is ProcessOwner и так далее ...
Самая большая проблема в том, что мне это нужно в неблокирующем режиме (Я не могу использовать спящий режим, иначе дерево тоже замерзнет, поэтому изменение цвета не будет замечено)
Если вы все еще не можете следить за мной, я пытаюсь имитировать то же поведение, которое делает Process Explorer или Process Hacker, когда процесс создано или удалено. Оба приложения закрашивают фон ячейки для этих процессов красным или зеленым на секунду, а затем переключаются обратно на исходный цвет, который имела ячейка.
Просто для информации, я получаю уведомление о создании или удалении процесса через wmi.