|
Windows-Taschenrechner "ausborgen"
Frage: Ich möchte eine Berechnung über den Windows-Taschenrechner vornehmen und muss dazu diesem die Werte übergeben und am Ende auch das Rechenergebnis auslesen. Wie kann ich aus meiner Delphi-Anwendung heraus den Taschenrechner fernsteuern?
Antwort: Das Windows-Zubehör Taschenrechner (calc.exe) stellt kein COM-Interface für die Automation zur Verfügung, so dass der konventielle Weg über die Windows-Botschaften genutzt werden muss. Das folgende Beispiel demonstriert, wie man den Taschenrechner von Windows für eigene Berechnungen nutzt und das Ergebnis im eigenen Delphi-Programm anzeigt. Die beiden Funktionen AppActivate und SendKeys stammen aus der Unit SNDKEY32.pas, die Borland im Extras-Unterverzeichnis der Delphi-CDROM mit ausliefert. Die Sleep-Aufrufe sollen nur den Ablauf im Taschenrechner visuell nachverfolgbar machen. Der zu suchende Fensterklassen-Name des Eingabefeldes des Taschenrecherns wurde über WinSight32 nachgeschlagen (siehe Abbildung):
uses ShellAPI, SNDKEY32;
procedure TForm1.Button1Click(Sender: TObject);
var
hCalcWnd : HWND;
hEditWnd : HWND;
iBuffLen : Integer;
pBuffer : PChar;
begin
hCalcWnd := FindWindow(nil, 'Rechner');
AppActivate('Rechner');
SendKeys('1{+}', True);
Sleep(500);
SendKeys('2', True);
Sleep(500);
SendKeys('~', True);
hEditWnd := FindWindowEx(hCalcWnd, 0, PChar('Edit'), nil);
if hEditWnd <> 0 then
begin
iBuffLen := SendMessage(hEditWnd, WM_GETTEXTLENGTH, 0, 0);
if iBuffLen > 0 then
begin
Inc(iBuffLen);
GetMem(pBuffer, iBuffLen);
try
SendMessage(hEditWnd, WM_GETTEXT, iBuffLen, LPARAM(pBuffer));
StatusBar1.SimpleText := pBuffer;
finally
FreeMem(pBuffer);
end
end
end;
end;
|