1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
| type
PFindWindowsStruct = ^TFindWindowsStruct;
TFindWindowsStruct = record
ProcessID: DWORD;
HandleList: TList;
end;
function EnumWindowsProc(hwnd: HWND; lParam: LPARAM): boolean; stdcall;
var
dwProcessId: DWORD;
begin
if lParam <> 0 then
begin
GetWindowThreadProcessId(hwnd, dwProcessId);
with PFindWindowsStruct(lParam)^ do
if dwProcessID = ProcessID then
HandleList.Add(Pointer(hwnd));
result:= true;
end
else
result:= false;
end;
procedure FindProcessWindows(ProcessID: Integer; Handles: TList);
var
findWindowsStruct: TFindWindowsStruct;
begin
findWindowsStruct.ProcessID:= ProcessID;
findWindowsStruct.HandleList:= Handles;
EnumWindows(@EnumWindowsProc, Integer(@findWindowsStruct));
end;
function NotepadPID: Cardinal;
var
StartInfo: TStartupInfo;
ProcessInfo: TProcessInformation;
begin
result:= 0;
{ Mise à zéro de la structure StartInfo }
FillChar(StartInfo, SizeOf(StartInfo), #0);
{ Seule la taille est renseignée, toutes les autres options }
{ laissées à zéro prendront les valeurs par défaut }
StartInfo.cb:= SizeOf(StartInfo);
{ Lancement de la ligne de commande }
if CreateProcess(nil, 'Notepad.exe', nil, nil, false,
0, nil, nil, StartInfo, ProcessInfo) then
result:= ProcessInfo.dwProcessId
else
RaiseLastOSError;
end;
function FindHandle(PID: Cardinal): HWND;
const
TIMEOUT = 5000; // 5 secs
var
handles: TList;
ticks: DWORD;
begin
handles:= TList.Create;
ticks:= GetTickCount;
try
while (handles.Count = 0) and (GetTickCount - ticks < TIMEOUT) do
FindProcessWindows(PID, handles);
if handles.Count > 0 then
result:= HWND(handles[0])
else
result:= 0;
finally
handles.Free;
end;
end;
function StartNotepad: HWND;
var
pid: Cardinal;
begin
pid:= NotepadPID;
result:= FindHandle(pid);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
h: HWND;
begin
h:= StartNotepad;
if h <> 0 then
begin
// On change la taille de la fenêtre
SetWindowPos(h, 0, 0, 0, 320, 200, 0);
// On change le parent de la fenêtre par notre panel (par exemple)
Windows.SetParent(h, panel1.Handle);
end;
end; |
Partager