[gelöst]SystemParametersInfo() funzt nich

shokwave
Beiträge: 471
Registriert: Do 15. Nov 2007, 16:58
OS, Lazarus, FPC: Win11/Ubuntu Budgie (L 3.0 FPC 3.2.2)
CPU-Target: i386, x64
Wohnort: Gera

[gelöst]SystemParametersInfo() funzt nich

Beitrag von shokwave »

Hi,

ich bin vor ein paar Tagen auf Lazarus gestoßen und finde das Projekt ganz interessant. Also wollte ich mal ein Delphi-Projekt von mir in Lazarus "bauen". Das Programm ändert das Hintergrundbild von Windows automatisch.

Alles basiert auf der Funktion

Code: Alles auswählen

SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, PChar(myPic), SPIF_SENDCHANGE OR SPIF_UPDATEINIFILE );


Das Programm wird ohne Fehler erstellt, jedoch wird der Desktophintergrund nur schwarz. Die Registryeinträge bleiben unverändert.

Was mach ich richtig, was alle andern falsch machen?

mfg shoKwave
Zuletzt geändert von shokwave am Mi 5. Dez 2007, 13:05, insgesamt 1-mal geändert.

Benutzeravatar
theo
Beiträge: 10498
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Das ist reines Winapi. Liegt deshalb wohl kaum an Lazarus.

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Code: Alles auswählen

SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, PChar(myPic)^, SPIF_SENDCHANGE OR SPIF_UPDATEINIFILE );


würd ich mal tippen ...
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Benutzeravatar
theo
Beiträge: 10498
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Christian hat geschrieben:

Code: Alles auswählen

SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, PChar(myPic)^, SPIF_SENDCHANGE OR SPIF_UPDATEINIFILE );


würd ich mal tippen ...


Das glaube ich eher nicht. Winapi erwartet da schon einen Pointer

Code: Alles auswählen

BOOL WINAPI SystemParametersInfo(
  __in     UINT uiAction,
  __in     UINT uiParam,
  __inout  PVOID pvParam,
  __in     UINT fWinIni
);



Ich vermute in diesem Bereich eher, dass er die AnsiStrings nicht eingeschaltet hat {$H+}
Aber würde das mit Shortstring überhaupt kompilieren..?..

pluto
Lazarusforum e. V.
Beiträge: 7180
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Wenn es dir nur darum geht unter Linux das Hintergrund Bild zu ändert könntest du es so machen:
gconftool-2 --type=string --set /desktop/gnome/background/picture_filename "${textb}"
Das musst du aber noch anpassen.
und ich weiß auch nicht ob gconftool immer Installiert ist auf jedem Linux-System bei mir auf jeden Fall*G*
MFG
Michael Springwald

shokwave
Beiträge: 471
Registriert: Do 15. Nov 2007, 16:58
OS, Lazarus, FPC: Win11/Ubuntu Budgie (L 3.0 FPC 3.2.2)
CPU-Target: i386, x64
Wohnort: Gera

Beitrag von shokwave »

Danke für die schnellen Antworten, aber

Code: Alles auswählen

SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, PChar(myPic)^, SPIF_SENDCHANGE OR SPIF_UPDATEINIFILE );
geht nicht. Da erhalte ich :
main.pas(94,62) Error: Incompatible type for arg no. 3: Got "Char", expected "Pointer"

shokwave
Beiträge: 471
Registriert: Do 15. Nov 2007, 16:58
OS, Lazarus, FPC: Win11/Ubuntu Budgie (L 3.0 FPC 3.2.2)
CPU-Target: i386, x64
Wohnort: Gera

Beitrag von shokwave »

@pluto
nach Linux wollte ich es erst portieren wenn die Windowsvariante läuft. Aber danke für den Tip, wird mir sicher noch mal hilfreich sein.
mfg Ingo

pluto
Lazarusforum e. V.
Beiträge: 7180
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

ich würde ja mal das ^ weg machen, bei API Funktionen reicht eigentlich ein PChar(so viel wie ich weiß)
MFG
Michael Springwald

Benutzeravatar
theo
Beiträge: 10498
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Pluto du Scherzkeks! ;-) Lies doch den Thread durch.
Erstens will er nix auf Linux machen und zweitens hat er den ^ nur reingemacht, weil Christian ihm das vorgeschlagen hat. Ist aber sowieso falsch.

@shokwave: Wie hast du denn myPic definiert?

shokwave
Beiträge: 471
Registriert: Do 15. Nov 2007, 16:58
OS, Lazarus, FPC: Win11/Ubuntu Budgie (L 3.0 FPC 3.2.2)
CPU-Target: i386, x64
Wohnort: Gera

Beitrag von shokwave »

@theo
{$H+} ist an. Hier mal der koplette Code.


Code: Alles auswählen

unit main;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, ExtCtrls, opbitmap,
  StdCtrls, Menus, ExtDlgs, IniFiles, windows;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    LiBo_Files: TListBox;
    MainMenu1: TMainMenu;
    MenuItem1: TMenuItem;
    MenuItem2: TMenuItem;
    MenuItem3: TMenuItem;
    MenuItem4: TMenuItem;
    MenuItem5: TMenuItem;
    MenuItem6: TMenuItem;
    OpDi_Pic: TOpenDialog;
    procedure Button1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
    procedure FormCreate(Sender: TObject);
    procedure MenuItem3Click(Sender: TObject);
    procedure MenuItem6Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
var RWCINI : TINIFile;
    Progdir:String;
 
{ TForm1 }
 
//Programm beenden
procedure TForm1.MenuItem3Click(Sender: TObject);
begin
  Close;
end;
 
 
//Programmstart
procedure TForm1.FormCreate(Sender: TObject);
var i:Integer;
    myPicList:TStrings;
begin
  ProgDir:=ExtractFilePath(ParamStr(0));
 
  //INI auslesen
  RWCINI:=TINIFile.Create(ProgDir+'RWC.INI');
  myPicList:=TStringList.Create;
  RWCINI.ReadSection('Papers', myPicList); //alle Bezeichner der Sektion auslesen
  if myPicList.Count>0 then  //nur wenn Bezeichner vorhanden sind...
  begin
    for i:=0 to myPicList.Count-1 do  //Alle Werte einlesen
    begin
      LiBo_Files.Items.Add(RWCINI.ReadString('Papers', myPicList.Strings[i], ''));
    end;
  end;
 
  myPicList.Free;
  RWCINI.Free;
end;
 
//Beim Programmende
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
var i:Integer;
begin
  DeleteFile(PChar(ProgDir+'RWC.INI'));
  RWCINI:=TINIFile.Create(ProgDir+'RWC.INI');
  for i:=0 to LiBo_Files.Items.Count-1 do
  begin
    RWCINI.WriteString('Papers', IntToStr(i+1), LiBo_Files.Items.Strings[i]);
  end;
  RWCINI.Free;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var myPic:String;
begin
  myPic:=LiBo_Files.Items.Strings[LiBo_Files.ItemIndex];
  SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, PChar(myPic)^, SPIF_SENDCHANGE OR SPIF_UPDATEINIFILE );
  MessageDlg(myPic, mtError, [mbOK],0);
end;
 
//Bild zur Liste hinzufügen
procedure TForm1.MenuItem6Click(Sender: TObject);
var i:Integer;
begin
  if OpDi_Pic.Execute then
  begin
    //Schleife für alle gewählten Bilder
    for i:=0 to OpDi_Pic.Files.Count-1 do
    begin
      LiBo_Files.Items.Add(OpDi_Pic.Files.Strings[i]);
    end;
  end;
end;
 
initialization
  {$I main.lrs}
 
end.

pluto
Lazarusforum e. V.
Beiträge: 7180
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Haha... also lag ich schon mal gar nicht so verkehrt(wenn du mich meinst)..... aber nach Windows kommt Linux *G*
MFG
Michael Springwald

Benutzeravatar
theo
Beiträge: 10498
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

@shokwave:
Was gibt denn SystemParametersInfo eigentlich zurück? True oder False?

shokwave
Beiträge: 471
Registriert: Do 15. Nov 2007, 16:58
OS, Lazarus, FPC: Win11/Ubuntu Budgie (L 3.0 FPC 3.2.2)
CPU-Target: i386, x64
Wohnort: Gera

Beitrag von shokwave »

Hab mal fix den code geändert:

Code: Alles auswählen

if SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, PChar(myPic), SPIF_SENDCHANGE OR SPIF_UPDATEINIFILE ) then
    MessageDlg(myPic, mtError, [mbOK],0);


Meldung kommt nich, also eher False. :(

Benutzeravatar
theo
Beiträge: 10498
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Führ doch mal mal nur diese Funktion aus.
Schreib was sinnvolles nach myPic (ich nehme an Bildpfad) und machs das gleiche auf dem gleichen Computer mit Delphi.
Würde mich echt wundern, wenn das auf D ginge und auf Laz nicht.

shokwave
Beiträge: 471
Registriert: Do 15. Nov 2007, 16:58
OS, Lazarus, FPC: Win11/Ubuntu Budgie (L 3.0 FPC 3.2.2)
CPU-Target: i386, x64
Wohnort: Gera

Beitrag von shokwave »

@theo
danke, dank, danke. Alles MEIN Fehler!!! Ich hab die ganze Zeit probiert ein jpg augerufen - die Funktion arbeitet aber nur mit Bitmaps.

sorry @ all. Ich geh jetzt in die Ecke und schäm mich! :cry:

Antworten