5

好吧,我有以下问题:

根据一些布尔变量,我用不同的颜色绘制了树细胞。例子:

  • 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 收到有关进程创建或删除的通知。

4

1 回答 1

5

每当创建一个进程时,启动一个与该进程关联的计时器,超时时间为 1 秒。isProcessMarkedForCreation设置为 true,因此该行被涂成绿色。当计时器触发时,处理程序设置isProcessMarkedForCreation为 false 并强制重新绘制该行,从而消除绿色突出显示。现在计时器已经完成了它的工作,它应该被删除。完全相同的方法可用于删除。

于 2011-07-04T09:12:11.287 回答