Ну, у меня есть следующая проблема:
Я нарисовал клетки дерева разными цветами в зависимости от некоторых логических переменных.
Пример:
- isProcessService
- isProcessInDebugger
- isProcessService
- isProcessElevated,
- isProcessNet
- isProcessOwner
- isProcessinJob
- isProcessPacked
- isProcessMarkedForDeletion
- isProcessMarkedForCreation: Boolean;
Итак, в 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.