안녕하세요 고수님들....
항상 이 사이트를 열때마다 많은 호기심과 많은 도움이 됩니다.
다름이 아니라 ...
현재 원도우가 부팅시 수많은 프로그램들이 열려진 것을 알수가 있습니다.
그런데 델파이에서는 이미 열려진 프로그램들의 리스트를 볼수있는 방법이 있는지요..
그리고 열려진 파일들 중에 원하는 프로그램들을 강제로 종료 할수 있는지요..
제가 얼뜻 본 것같기도 한데 .....
아시는 분은 가르쳐주세요....
고수님들의 조언을 부탁합니다......
그리고 제가 초보라 용어에 대해서는 잘모릅니다.
아주 상세히 좀 가르쳐주세요....
제가.. 여기 저기 지나다니면서 얻은 팁입니다..
물론 제가 작성한 것은 아니구요..저도 이 팁에서 힌트를 얻고 작업했습니다.
소스니까. 한번 보세요..
그리고 실행된 프로그램은 아래 소스에서 얻은 핸들로 다음과 같이 하시면 됩니다.
SendMessage( Handle, WM_SYSCOMMAND, SC_CLOSE, 0 );
도움이 되셨으면 좋겠네요..
----------------------------------------------------------------------------------
// Button1을 클릭하면 현재 실행중인 Application의 리스트를 ListBox1에 구한다
// LibtBox1에서 특정 프로그램을 클릭하면 Label1에 그 프로그램의 정보를 보여준다
// Button2를 클릭하면 이 프로그램을 제외한 나머지 프로그램들을 Minimized 시킨다
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
ListBox1: TListBox;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure ListBox1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
function EnumWindowsProc(Wnd: HWND; lb: TListbox): BOOL; stdcall;
var
caption: Array [0..128] of Char;
begin
Result := True;
if {skip invisible windows}
IsWindowVisible(Wnd) and
{only process truly top-level windows. GetWindowLong must be used, not GetParent}
((GetWindowLong(Wnd, GWL_HWNDPARENT) = 0) or
(HWND(GetWindowLong(Wnd, GWL_HWNDPARENT)) = GetDesktopWindow)) and
{skip WS_EX_TOOLWINDOW windows}
((GetWindowLong(Wnd, GWL_EXSTYLE) and WS_EX_TOOLWINDOW) = 0) then
begin
SendMessage(Wnd, WM_GETTEXT, Sizeof(caption), integer(@caption));
lb.Items.AddObject(caption, TObject(Wnd));
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ListBox1.Clear;
EnumWindows(@EnumWindowsProc, Integer(ListBox1));
end;
procedure TForm1.ListBox1Click(Sender: TObject);
var
theClassname: array [0..128] of Char;
Wnd: HWND;
tid, pid: DWORD;
begin
with Sender as TListbox do
begin
if ItemIndex >= 0 then
begin
Wnd := HWND(Items.Objects[itemindex]);
if Wnd <> 0 then
begin
Windows.GetClassname(Wnd, theClassname, Sizeof(classname));
tid := GetWindowThreadProcessID(Wnd, @pid );
label1.caption :=
Format(
'HWND: %8.8x'#13#10+
'Class: %s'#13#10+
'Process ID: %8.8x'#13#10+
'Thread ID: %8.8x',
[Wnd, theClassname, pid, tid] );
end;
end;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
i: Integer;
Wnd: HWND;
begin
for i := 0 to ListBox1.Items.Count-1 do
begin
Wnd := HWND(ListBox1.Items.Objects[i]);
// 이 프로그램이 아니고 minimized(iconic)가 아니면...
if (Wnd <> 0) and (Wnd <> Application.Handle) then
if not IsIconic(Wnd) then
begin
ShowWindow(Wnd, SW_HIDE);
ShowWindow(Wnd, SW_MINIMIZE);
end;
end;
end;
end.
----------------------------------------------------------------------------------
지승현 wrote:
> 안녕하세요 고수님들....
> 항상 이 사이트를 열때마다 많은 호기심과 많은 도움이 됩니다.
> 다름이 아니라 ...
> 현재 원도우가 부팅시 수많은 프로그램들이 열려진 것을 알수가 있습니다.
> 그런데 델파이에서는 이미 열려진 프로그램들의 리스트를 볼수있는 방법이 있는지요..
> 그리고 열려진 파일들 중에 원하는 프로그램들을 강제로 종료 할수 있는지요..
> 제가 얼뜻 본 것같기도 한데 .....
> 아시는 분은 가르쳐주세요....
> 고수님들의 조언을 부탁합니다......
> 그리고 제가 초보라 용어에 대해서는 잘모릅니다.
> 아주 상세히 좀 가르쳐주세요....
>