Ich arbeite zu Zeit viel mit einem Wave-Editor (WavePad) und habe einen häufig wiederkehrenden Vorgang abzuarbeiten, nämlich
1) Ab aktueller Position bis Dateianfang markieren.
2) Im Bearbeiten-Menu "Markierten Bereich speichern als" wählen.
3) Im dann erscheinenden SaveDialog den Dateinamen eingeben.
4) "Speichern"-Button drücken.
Ich möchte das automatisieren.
1 und 2 habe ich bereits.
Das
Handle des SaveDialogs finde ich auch.
Aber für das dann folgende macht mir die EnumProc, die ich zum suchen des Edits für den Dateinamen und des "Speichern"-Buttons verwende, Probleme.
Die EnumProc läuft einmal fehlerfrei durch und beim zweiten Durchlauf krachts:
Im Projekt Chat.exe ist eine
Exception der Klasse $C0000005 mit der Meldung '
access violation at 0x005632cc: read of address 0x0c7164b0' aufgetreten.
Das Ganze ist reproduzierbar.
Hat jemand eine Idee, wo der Fehler liegt?
Delphi-Quellcode:
function SaveDlgEnumProc(win:HWND; ctrls:array of HWND): BOOL; stdcall;
var s:string; buf:array[0..255] of char;
begin
Result:=True;
GetClassName(win,buf,256);
s:=buf;
if s='Button' then begin
SendMessage(win,WM_GETTEXT,256,Integer(@buf));
s:=buf;
if s='Speichern' then ctrls[1]:=win;
end else if s='Edit' then begin
ctrls[0]:=win;
end;
end;
Delphi-Quellcode:
PROCEDURE TMain.Test(win:HWND; const dsn:string);
var ctrls:Array of HWND;
begin
SetLength(ctrls,2);
ctrls[0]:=0; // Edit
ctrls[1]:=0; // Speichern-Button
EnumChildWindows(Win,@SaveDlgEnumProc,NativeInt(ctrls));
if ctrls[0]<>0 then begin
SendMessage(ctrls[0],WM_SETTEXT,0,Integer(PChar(dsn)));
if Ctrls[1]<>0 then SendMessage(ctrls[1],BM_Click,0,0);
end;
end;