PDA

View Full Version : لیست برنامه های نصب شده، و اجرای برنامه انتخاب شده



mehditabasi
یک شنبه 16 تیر 1387, 12:58 عصر
با سلام
من می خواهم برنامه ای با دلفی بنویسم که لیستی از فایلهای اجرایی را به صورت کمبو نمایش دهد و کاربر با انتخاب یکی آن را اجرا کند و پس از کار با برنامه مورد نظر و بستن آن، برنامه اصلی از بسته شدن برنامه با خبر شود و رکوردی در جدول درج کند مبنی بر اینکه برنامه مورد نظر در چه ساعتی اجرا شده و در چه ساعتی خاتمه یافته است.
با تشکر

Hsimple11
یک شنبه 16 تیر 1387, 16:19 عصر
منظورتان لیستی از فایلهای اجرایی است یا برنامه های روتین نصب شده؟ بسیاری از فایلهای اجرایی معمولا نه توسط کاربر باز شده و نه بسته می شوند. اگر لیست برنامه های نصب شده منظورتان است می توانید از کلیدی که در رجیستری برای ثبت Uninstall ها وجود دارد استفاده کنید :


uses Registry;
...
procedure TForm1.Button1Click(Sender: TObject);
var
MyList: TStringList;
MyRegistry: TRegistry;
i: Integer;
Str: string;
begin
MyRegistry:=TRegistry.Create;
MyList:=TStringList.Create;
with MyRegistry do
begin
RootKey:=HKEY_LOCAL_MACHINE;
if OpenKey(
'Software\Microsoft\Windows\CurrentVersion\Uninsta ll',
False)=True then GetKeyNames(MyList);
CloseKey;

for i:=0 to MyList.Count-1 do
begin
RootKey:=HKEY_LOCAL_MACHINE;
OpenKey(
'Software\Microsoft\Windows\CurrentVersion\Uninsta ll\'+
MyList[i],
False);
Str:=ReadString('DisplayName');
if Str<>'' then
Memo1.Lines.Add(ReadString('DisplayName'));
CloseKey;
end;
end;
end;

Hsimple11
یک شنبه 16 تیر 1387, 16:21 عصر
برای اجرای فایلهای exe خارج از برنامه هم میتوانید از توابع ShellAPI ویندوز استفاده کنید. قبلا بحث شده. جستجو کنید.

mehditabasi
یک شنبه 16 تیر 1387, 19:54 عصر
با تشکر از Hsimple11.
منظورم از لیست برنامه ها، برنامه های تولید شده با سی++ یا هر زبان دیگری است.
مشکل اصلی من زمانی است که برنامه مورد نظر توسط کاربر بسته میشود.
من می خواهم برنامه من از بسته شدن exe اجرا شده مطلع شود. البته فکر میکنم باید در یک تایمر وجود برنامه را در تسک منیجر ویندوز چک کنم اما تابع موردنظر (FindWindow) کار نمیکند. اگر تابع بهتر و یا راه بهتری به نظرتان میرسد بگویید. ممنون میشم.

mehditabasi
یک شنبه 16 تیر 1387, 19:55 عصر
البته متذکر شوم که :
در مورد طریقه اجرا فایلهای exe مشکلی ندارم

mehditabasi
یک شنبه 16 تیر 1387, 20:05 عصر
البته متذکر شوم که :
در مورد طریقه اجرا فایلهای exe مشکلی ندارم

Hsimple11
دوشنبه 17 تیر 1387, 20:32 عصر
می توانید از کلاس TProcessInformation استفاده کنید. درباره آن جستجو کنید.


function TfrmMain.WinExecAndWait(FileName:String; Visibility : integer):Thandle;
var
zAppName:array[0..512] of char;
zCurDir:array[0..255] of char;
WorkDir:String;

StartupInfo:TStartupInfo;
ProcessInfo:TProcessInformation;
begin
StrPCopy(zAppName,FileName);
GetDir(0,WorkDir);
StrPCopy(zCurDir,WorkDir);
FillChar(StartupInfo,Sizeof(StartupInfo),#0);
StartupInfo.cb := Sizeof(StartupInfo);
StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow := Visibility;
if not CreateProcess(nil,zAppName,nil,nil,false,CREATE_NE W_CONSOLE or
NORMAL_PRIORITY_CLASS,
nil,nil,StartupInfo, ProcessInfo) then begin Result :=0; exit; end
else begin
WaitforSingleObject(ProcessInfo.hProcess,INFINITE) ;
GetExitCodeProcess(ProcessInfo.hProcess,Result);
end;
end;

mehditabasi
سه شنبه 18 تیر 1387, 13:45 عصر
با تشکر فراوان
جواب نهایی را در وب سایت زیر پیدا کردم.
http://www.latiumsoftware.com/en/delphi/00003.php:چشمک: (http://www.latiumsoftware.com/en/delphi/00003.php)