0

我一直在尝试破解fuzzyflakes屏幕保护程序,以便在选择特定颜色(颜色#A9D691)时将薄片的颜色更改为白色。我似乎无法确切地弄清楚如何做到这一点(我对这些东西有点菜鸟)。

我查看了代码,看起来薄片的颜色设置在FuzzyFlakesInit()函数末尾附近,就在这里:

Flake.ForeColor = FuzzyFlakesColorResource(Flake.Colors.Fore);
Flake.BackColor = FuzzyFlakesColorResource(Flake.Colors.Back);
Flake.BordColor = FuzzyFlakesColorResource(Flake.Colors.Bord);

Flake.GCValues.foreground = Flake.ForeColor;
Flake.GCValues.background = Flake.BackColor;

我要做的是首先检查是否设置了特定颜色,如果设置了Flake.Colors.Fore变量,请将变量设置为白色。我试过使用这样的代码:

if (flake->Colors.Fore == (char) "#A9D691") {
         flake->ForeColor = FuzzyFlakesColorResource(flake, "white");
          } else {
        flake->ForeColor = FuzzyFlakesColorResource(flake, flake->Colors.Fore);
       } 
flake->BackColor = FuzzyFlakesColorResource(flake, flake->Colors.Back);
flake->BordColor = FuzzyFlakesColorResource(flake, flake->Colors.Bord);

可悲的是,像这样的简单黑客攻击不起作用。所以我不知道我是否必须将“#A9D691”转换为其他东西或什么,因为该FuzzyFlakesColorHelper()函数似乎已经设置了这些变量。

4

2 回答 2

2
if (flake->Colors.Fore == (char) "#A9D691")

将颜色字符串与指向字符串字面量的指针进行比较"#A9D691",转换为 a char,它永远不会返回 true。你想比较字符串的值,所以使用strcmp

if (strcmp(flake->Colors.Fore, "#A9D691") == 0)
于 2012-07-17T23:04:14.160 回答
1

抱歉,有错误的颜色算法。从来没有按预期工作,我应该在提交代码之前对其进行更多调试。您必须将更改放入 FuzzyFlakesColorHelper。如果您更改了行:

sprintf(Flake.Colors.Fore, "#%02X%02X%02X", iR0, iG0, iB0);

类似于

sprintf(Flake.Colors.Fore, "#%02X%02X%02X", 0xFF, 0xFF, 0xFF);

这将使薄片变成白色或简单地更改 FuzzyFlakesInit 中的 Flake.Colors.Fore。

  /*
   * Here we establish our colormap based on what is in
   * Flake.Colors.Back
   */
  if (FuzzyFlakesColorHelper())
    {
       fprintf(stderr, " reverting to random\n");
       if (Flake.Colors.Back)
        free(Flake.Colors.Back);
       Flake.Colors.Back = malloc(sizeof(unsigned char) * 8);
       sprintf(Flake.Colors.Back, "#%X%X%X%X%X%X", random() % 16,
             random() % 16, random() % 16, random() % 16, random() % 16,
             random() % 16);
       FuzzyFlakesColorHelper();
    }


  Flake.BackColor = FuzzyFlakesColorResource(Flake.Colors.Back);
  Flake.BordColor = FuzzyFlakesColorResource(Flake.Colors.Bord);

如果您希望能够以十六进制形式#ffffff 指定颜色,则必须通过 FuzzyFlakesColorResource 传递它。这将从该形式转换为 xscreensaver 和 X11 使用的形式。

它的工作方式是你给它的颜色是背景颜色,然后这个颜色算法应该选择边框颜色 (Flake.Colors.Bord) 和薄片颜色 (Flake.Colors.Fore) 如果你完全绕过 FuzzyFlakeColorHelper并手动设置可以解决问题的颜色(这就是原始版本的工作方式,并且颜色被硬编码到原始版本中,但我认为能够指定一种颜色并为您挑选两种类似的颜色会很整洁。 ) 很高兴人们多年后仍然喜欢我的屏幕保护程序,祝你好运。

于 2014-03-15T02:03:52.343 回答