Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.07.2009, 16:39   #1
AndersX
 
Регистрация: 28.07.2009
Сообщений: 4
По умолчанию Получить дескриптор окна другого приложения и сделать его активным Delphi 7

Нашел пример... на дельфи ворд.
перепесал под себя но оно не пашет... Окно точно есть екселевское толи я торможу то ли что то не так.
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

type
  PFindWindowStruct = ^TFindWindowStruct;
  TFindWindowStruct = record
  Caption : string;
  ClassName : string;
  WindowHandle : THandle;
end;

function EnumWindowsProc(hWindow : hWnd; lParam : LongInt) : Bool {$IFDEF Win32} stdcall; {$ELSE} ; export; {$ENDIF}
var
  lpBuffer: PChar;
  WindowCaptionFound: bool;
  ClassNameFound: bool;
begin
  GetMem(lpBuffer, 255);
  Result := True;
  WindowCaptionFound := False;
  ClassNameFound := False;

  try
    if GetWindowText(hWindow, lpBuffer, 255) > 0 then
      if Pos(PFindWindowStruct(lParam).Caption, StrPas(lpBuffer)) > 0 then
        WindowCaptionFound := true;

    if PFindWindowStruct(lParam).ClassName = '' then
      ClassNameFound := True
    else
    if GetClassName(hWindow, lpBuffer, 255) > 0 then
      if Pos(PFindWindowStruct(lParam).ClassName, StrPas(lpBuffer)) > 0 then
        ClassNameFound := True;

    if (WindowCaptionFound and ClassNameFound) then
    begin
      PFindWindowStruct(lParam).WindowHandle := hWindow;
      Result := False;
    end;

  finally
    FreeMem(lpBuffer, sizeof(lpBuffer^));
  end;
end;

function FindAWindow(Caption : string; ClassName : string) : THandle;
var
  WindowInfo : TFindWindowStruct;
begin
  with WindowInfo do begin
    Caption := Caption;
    ClassName := ClassName;
    WindowHandle := 0;
    EnumWindows(@EnumWindowsProc, LongInt(@WindowInfo));
    FindAWindow := WindowHandle;
  end;
end;




procedure TForm1.Button1Click(Sender: TObject);
var
  TheWindowHandle : THandle;
begin
  TheWindowHandle := FindAWindow('Microsoft Excel', '');
  if TheWindowHandle = 0 then
    ShowMessage('Window Not Found!')
  else
    BringWindowToTop(TheWindowHandle);
end;

end.
или всетаки пример не коректный????
AndersX вне форума Ответить с цитированием
Старый 30.07.2009, 16:48   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Вот попроще могу предложить:
Код:
var h:hwnd;p:pchar;mk:Cardinal;
begin
 h:=GetWindow(GetForegroundWindow,GW_HWNDFIRST);
 getmem(p,2000);
 GetWindowText(h,p,mk);
 while (pos('Excel',p)=0)and(h<>0) do begin
  h:=GetWindow(h,GW_HWNDNEXT);
  GetWindowText(h,p,mk);
 end;
 caption:=inttostr(h)+' '+p;
end;
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.07.2009, 17:00   #3
AndersX
 
Регистрация: 28.07.2009
Сообщений: 4
По умолчанию

Ога СПАСИБО... Огромное...

получается окончательно таким образом

Код:

procedure TForm1.Button1Click(Sender: TObject);
var h:hwnd;p:pchar;mk:Cardinal;
begin
 h:=GetWindow(GetForegroundWindow,GW_HWNDFIRST);
 getmem(p,2000);
 GetWindowText(h,p,mk);
 while (pos('Excel',p)=0)and(h<>0) do begin
  h:=GetWindow(h,GW_HWNDNEXT);
  GetWindowText(h,p,mk);
 end;
  If (h <> 0 )then BringWindowToTop(h);
end;
AndersX вне форума Ответить с цитированием
Старый 18.10.2009, 02:53   #4
100GRamm
ХРЕНЕЮ с ИНДИ
Пользователь
 
Аватар для 100GRamm
 
Регистрация: 08.02.2009
Сообщений: 92
По умолчанию

..а если с CreatProcess? мне надо запустить прогу (из под моей) а потом знать запущенна она или нет, при том что, будет запущенно еще много других? ...короче: я получаю от CreatProcess структуру TProseccInformation, но что потом с ним делать? мне посути надо хендл, но как его получить из этих четырех параметров? ... или может, есть другой способ?(заголовок окна неизвестензаранее) то есть как то надо или хендл отловить или вот этот гребанный TPROCESSINFORMATION? ПЛЗ подскажите!
Велкам! :D http://radiomedtech.ucoz.ru
100GRamm вне форума Ответить с цитированием
Старый 18.10.2009, 09:32   #5
100GRamm
ХРЕНЕЮ с ИНДИ
Пользователь
 
Аватар для 100GRamm
 
Регистрация: 08.02.2009
Сообщений: 92
По умолчанию

type
Tmyproc=record
Fmp: TPROCESSINFORMATION;
Wmp: pchar;
end;

var
Form1: TForm1;
piArr: array [0..10] of Tmyproc ;
ipi:integer;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var si: TSTARTUPINFO;
pi: TPROCESSINFORMATION;

begin
fillchar(si,sizeof(si),#0);
si.cb:=sizeof(si);
if not createprocessa(nil,pchar(edit1.Text ),nil,nil,false,0,nil,nil,si,pi) then form1.Memo1.Lines.Add('Ошибка! '+inttostr(getlasterror()))
else begin
piArr[ipi].Fmp:=pi;
piArr[ipi].Wmp:=pchar(edit1.Text);
inc(ipi);
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var i:integer;
begin
form1.Memo1.Lines.Add('Список процессов: ');
for i:= 0 to ipi-1 do
form1.Memo1.Lines.Add(inttostr(i)+' ) '+
'; dwP: '+inttostr(piArr[i].Fmp.dwProcessId)+
'; dwT: '+inttostr(piArr[i].Fmp.dwThreadId)+
'; hP: '+inttostr(piArr[i].Fmp.hProcess)+
'; hT: '+inttostr(piArr[i].Fmp.hThread)+
' '+piArr[i].Wmp);
end;


procedure TForm1.FormActivate(Sender: TObject);
begin
ipi:=0;
end; Вот это запускает передает какие то параметры (4) но смыслая в них не вижу- как их использовать?
Велкам! :D http://radiomedtech.ucoz.ru

Последний раз редактировалось 100GRamm; 18.10.2009 в 09:47. Причина: некорректный вопрос
100GRamm вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как на WinApi получить все дочерние окна приложения? Wadimka Работа с сетью в Delphi 8 27.05.2009 14:25
Получить Handle TEdit'a, зная дескриптор родительского окна Cold_Night Win Api 2 13.02.2009 16:47
Как получить handle главного окна, зная имя приложения? Altera Win Api 8 22.12.2008 18:52
как получить дескриптор приложения в C#? fiatik Общие вопросы .NET 1 08.11.2008 08:18