Структура программирования, программирование, языки программирования, книги программирование На сайте представлена информация про программирование в Интернете и работу  

Какой версией Delphi вы пользуетесь, Просто интересно знать...
Округление чисел, Как округ число в большую сторону
Как какой-либо переменной передать, все свойства какого-нибудь компонента?
Можно ли открючить рамку у TRadioGroup?
3D-объекты
События при изменении изображения на экр
Как программно закрыть окно чужой программы?, Зная его заголовок. MessageDlg
Научить приложение в Делфи говорить
Монитор!!!, подскажите недотёпе
Как передвигать программно курсор в TEdit-e
Помогите
Как обработать минимизацию формы?, Как обработать минимизацию формы?
Компонент в RichEdit, Компонент в RichEdit мешает
Полигон для формы, Создание, редактирование полигонов
Аналоги процедур
Задачка по программированию есть.
Как попасть в ProgramFiles, Как попасть в ProgramFiles
Виртуальные диски, и работа с ними
Запуск программы с ограниченными правами, Win2003Server Ent + MSSQL и сетевой диск
Файловый менеджер, Помогите может кто уже писал
Как прекрепить файл к The Bat!, Не подскажите?
длинная строка
DELPHI 2005, Delphi 9
Telnet, про телнет
Компоненты для плоского меню
как присоединить поток к чужой проге?
TeeChart 7.0 Pro, Качайте
Как передать управление другой процедуре?
Работа с типами данных, Single и array [0..3] of byte
Компоненты для создания меню в стиле XP, Не знаете - есть ли они в природе?
Как Вы относитесь к курящим девушкам?
Как запаролить открытие формы в Delphi?
Система ленейных уравнений, Метод Гаусса
Данные по порту...
Нужен ZIP компонент, позволяющий сжатие данных по блокам
блокировка текстового файла, блокировка текстового файла
DelphiX для Delphi 6
Компонент "богатый текст", написать его...
Как записать динамический массив в бинарный файл.
Как вставить файл WAVES.S3M в форму
DBGrid, Проблема с настройками свойств
Как запустить "'desk.cpl" расширение .cpl, расширение .cpl
Создание события, Новое событие
Задача на деревья, Может кто знает как решить это?
Синтаксический и лексический анализаторы, Каков алгоритм их работы
OLE и TWebBrowser, OLE и TWebBrowser
ВЫзов Фукнкции, помогите высзвать функцию
Как запустить файл из system32 расширения .msc
Как отключить кнопку развернуть
как в программе узнать запущена другая программа?
Рисунок с рабочго стола по LAN, Рисунок с рабочго стола
вот блин а Дельфи - это СЛОЖНАЯ ВЕЩЬ, и никто не предуредил
Вложенные циклы, Кол-во вложенных циклов
Строки, общая подстрока
Как пройти из точки A(x1;y1) в точку B(x2;y2)..., ...по прямой линии
Помогите найти ошибку в модуле компонента, для компиляции
Image через Timer
Написание Service
Как копировать одну ячейку StringGrid'a?
Системное время
frames, or..?
список MsSql серверов
Скины для формы
Ошибка в наследнике TStringGrid, Ошибка в наследнике TStringGrid
Динамическое создание обьектов, как динамически создать обьект???
Динамическое создание форм
Помогите пожалуйчта решить сложную задачку, из префиксной формы в постфиксную
Работа с файлом, как проч. ф. по 20 симв. в строках
screensaver
Как к приложению прикрепить иконку?

Платные хостинги     Раскрутка сайта     Книги по программированию


Как программно закрыть окно чужой программы?, Зная его заголовок. MessageDlg

Только здесь 1000 посетителей на Ваш сайт всего за 3 у.е.!

- Выскакивает MessageDlg вот его надо закрыть.Ипользую так:Код wnd2 := FindAWindow('Global Mail', '');  if wnd2 = 0 then   ShowMessage('Окно выборочный инмпорт не найдено') else begin   wndBtn := FindWindowEx (wnd2, 0, nil, 'OK');   // имитируем клик мышкой   SendMessage(wndBtn, WM_LBUTTONDOWN, 0, 0);   SendMessage(wndBtn, WM_LBUTTONUP, 0, 0);  end;highlightSyntax('delphiMzNjll','delphi');Т.е. Выскакивает MessageDlg c заголовком 'Global Mail' и кнопкой ОК.Вот надо программно нажать эту кнопку! Нажиматься не хочет!Как?

- А тебе точно в wndBtn возвращают handle кнопки?

- Вот этого я как раз-то и не знаю. Скорее всего идет поиск окна 'Global Mail' - это заколовок и основного окна. Там идет поиск нопки "ОК" которой нет... а вот на MessageDlg помоему код внимания не обращает...

- StartBtnWnd:=FindWindow('Shell_TrayWnd', nil); здесь мы ищем окно(Handle) StartBtnBmp:=FindWindowEx(StartBtnWnd, 0,'Button', nil); затем функцией ....Ex ищеться (и только ей,а не "FindAWindow" )уже в окне кнопка с именем или назвыавнием класса "Button",а её потом можешь её уже нажимать .Ща поподробней попозже опишу! ))) Подожди Добавлено @ 08:48 Вот простой пример закрытия окна Microsoft WordЭто способ №2Коментарии писать не буду нет пока время ,если чё не понял пиши отвечу ни сразу ,но отвечу!)))var h:hWnd;begin h:=FindWindow(nil, 'Microsoft Word'); if h=0 then exit; SendMessage(h, WM_DESTROY, 0,0);end;

- ХХхххххх.... нифига не один метод не подходит (((все окна закрываются, а вот MessageDlg не хочет

- Полный исходник:Код uses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, StdCtrls;type  TForm1 = class(TForm)    Button1: TButton;    Button2: TButton;    Label1: TLabel;    procedure Button1Click(Sender: TObject);    procedure Button2Click(Sender: TObject);  private    { Private declarations }  public    menu : HMENU; TheWindowHandle, wnd2, wndBtn : HWND; nItem, nItemID : integer; mi : TMENUINFO; h,StartBtnWnd,StartBtnBmp:hWnd;  end;  typePFindWindowStruct = ^TFindWindowStruct;TFindWindowStruct = recordCaption : string;ClassName : string;WindowHandle : THandle;end;var  Form1: TForm1;implementation{$R *.dfm}function EnumWindowsProc(hWindow : hWnd;lParam : LongInt) : Bool{$IFDEF Win32} stdcall; {$ELSE}; export; {$ENDIF}varlpBuffer : PChar;WindowCaptionFound : bool;ClassNameFound : bool;beginGetMem(lpBuffer, 255);Result := True;WindowCaptionFound := False;ClassNameFound := False;tryif GetWindowText(hWindow, lpBuffer, 255) > 0 thenif Pos(PFindWindowStruct(lParam).Caption, StrPas(lpBuffer)) > 0then WindowCaptionFound := true;if PFindWindowStruct(lParam).ClassName = '' thenClassNameFound := True elseif GetClassName(hWindow, lpBuffer, 255) > 0 thenif Pos(PFindWindowStruct(lParam).ClassName, StrPas(lpBuffer))> 0 then ClassNameFound := True;if (WindowCaptionFound and ClassNameFound) then beginPFindWindowStruct(lParam).WindowHandle := hWindow;Result := False;end;finallyFreeMem(lpBuffer, sizeof(lpBuffer^));end;end;function FindAWindow(ACaption : string;AClassName : string) : THandle;varWindowInfo : TFindWindowStruct;beginwith WindowInfo do beginCaption := ACaption;ClassName := AClassName;WindowHandle := 0;EnumWindows(@EnumWindowsProc, LongInt(@WindowInfo));FindAWindow := WindowHandle;end;end; function FindMenuItem (m : HMENU; const Item : string) : integer; var   i : integer;   Buf : PChar; begin   Result := -1;   GetMem (Buf, 255);   for i := 0 to GetMenuItemCount(m)-1 do   begin     GetMenuString (m, i, Buf, 255, MF_BYPOSITION);     if Buf = Item then     begin       Result := i;       Break;     end;   end;   FreeMem (Buf); end;procedure Delay(Value:Cardinal);   //в миллисекундахvar F, N:Cardinal;beginN:=0;while N<=(Value div 10) do begin SleepEx(1,True); Application.ProcessMessages; Inc(N); end;F:=GetTickCount; repeat Application.ProcessMessages; N:=GetTickCount; until (N-F>=(Value mod 10)) or (N<F);end;procedure TForm1.Button1Click(Sender: TObject);  //Импортvar TheWindowHandle : THandle;begin TheWindowHandle := FindAWindow('Global Mail', ''); if TheWindowHandle = 0 then  begin   ShowMessage('Окно не нейдено!')  end else begin  //BringWindowToTop(TheWindowHandle);  TheWindowHandle := FindAWindow('Global Mail', '');  menu := GetMenu (TheWindowHandle);  //menu := MainMenu1.Handle;  menu := GetSubMenu (menu, FindMenuItem (menu, 'Файл'));  menu := GetSubMenu (menu, FindMenuItem (menu, 'Импорт'));  nItem := FindMenuItem (menu, 'Выборочный импорт...');  // нашли наш пункт меню, теперь надо активировать его  nItemID := GetMenuItemID (menu, nItem);  mi.cbSize := SizeOf(mi);  GetMenuInfo (menu, mi);  if (mi.dwStyle and MNS_NOTIFYBYPOS) = MNS_NOTIFYBYPOS then  begin   SendMessage (TheWindowHandle, WM_MENUCOMMAND, nItem, menu);   end  else   PostMessage(TheWindowHandle, WM_COMMAND, nItemID, 0);   BringWindowToTop(TheWindowHandle);// repeat   wnd2 := FindAWindow('Выборочный импорт', ''); //FindWindow (nil, 'Выборочный импорт');   if wnd2 = 0 then   ShowMessage('Окно выборочный импорт не найдено') else   //   Sleep(0);// until wnd2 <> 0;  begin   wndBtn := FindWindowEx (wnd2, 0, nil, 'Начать');   // имитируем клик мышкой   SendMessage(wndBtn, WM_LBUTTONDOWN, 0, 0);   SendMessage(wndBtn, WM_LBUTTONUP, 0, 0);  end;  Delay( 25000 );  ///////////////////////////////////////////////////////////// { StartBtnWnd:=FindWindow('Global Mail', nil); //здесь мы ищем окно(Handle)  StartBtnBmp:=FindWindowEx(StartBtnWnd, 0,nil, 'OK'); //затем функцией ....Ex ищеться (и только ей,а не "FindAWindow"  SendMessage(StartBtnWnd, WM_LBUTTONDOWN, 0, 0);  SendMessage(StartBtnBmp, WM_LBUTTONUP, 0, 0);}  begin  h:=FindWindow(nil, 'Global Mail');  if h=0 then exit;  SendMessage(h, WM_DESTROY, 0,0);  end;  /////////  wnd2 := FindAWindow('Global Mail', ''); //Сдесь ищем окно и на нем нопку "ОК"  if wnd2 = 0 then   ShowMessage('Окно не найдено')   //никогда не выводится. значит окно найдено else begin   wndBtn := FindWindowEx (wnd2, 0, nil, 'OK');   // имитируем клик мышкой   SendMessage(wndBtn, WM_LBUTTONDOWN, 0, 0);   SendMessage(wndBtn, WM_LBUTTONUP, 0, 0);  end;  ///////////////////////////////////////////////////////////// end;end;procedure TForm1.Button2Click(Sender: TObject);var TheWindowHandle : THandle;begin TheWindowHandle := FindAWindow('Global Mail', ''); if TheWindowHandle = 0 then  begin   ShowMessage('Окно не нейдено!')  end else begin  //BringWindowToTop(TheWindowHandle);  TheWindowHandle := FindAWindow('Global Mail', '');  menu := GetMenu (TheWindowHandle);  //menu := MainMenu1.Handle;  menu := GetSubMenu (menu, FindMenuItem (menu, 'Файл'));  menu := GetSubMenu (menu, FindMenuItem (menu, 'Экспорт'));  nItem := FindMenuItem (menu, 'Экспорт в PC Sprint Mail...');  // нашли наш пункт меню, теперь надо активировать его  nItemID := GetMenuItemID (menu, nItem);  mi.cbSize := SizeOf(mi);  GetMenuInfo (menu, mi);  if (mi.dwStyle and MNS_NOTIFYBYPOS) = MNS_NOTIFYBYPOS then  begin   SendMessage (TheWindowHandle, WM_MENUCOMMAND, nItem, menu);   end  else   PostMessage(TheWindowHandle, WM_COMMAND, nItemID, 0);   BringWindowToTop(TheWindowHandle);// repeat   wnd2 := FindAWindow('Экспорт в PC Sprint Mail', ''); //FindWindow (nil, 'Выборочный импорт');   if wnd2 = 0 then   ShowMessage('Окно Экспорт в PC Sprint Mail не найдено') else   //   Sleep(0);// until wnd2 <> 0;  begin   wndBtn := FindWindowEx (wnd2, 0, nil, 'Начать');   // имитируем клик мышкой   SendMessage(wndBtn, WM_LBUTTONDOWN, 0, 0);   SendMessage(wndBtn, WM_LBUTTONUP, 0, 0);  end;  Delay( 50000 );  /////////////////////////////////////////////////////////////  wnd2 := FindWindow(nil,'Global Mail');  if wnd2 = 0 then   ShowMessage('Окно выборочный инмпорт не найдено') else begin   wndBtn := FindWindowEx (wnd2, 0, nil, 'OK');   // имитируем клик мышкой   SendMessage(wndBtn, WM_LBUTTONDOWN, 0, 0);   SendMessage(wndBtn, WM_LBUTTONUP, 0, 0);  end;  /////////////////////////////////////////////////////////////  Delay( 50000 );  /////////////////////////////////////////////////////////////  wnd2 := FindAWindow('Экспорт в PC Sprint Mail', '');  if wnd2 = 0 then   ShowMessage('Окно Экспорт в PC Sprint Mail не найдено') else begin   wndBtn := FindWindowEx (wnd2, 0, nil, 'Закрыть');   // имитируем клик мышкой   SendMessage(wndBtn, WM_LBUTTONDOWN, 0, 0);   SendMessage(wndBtn, WM_LBUTTONUP, 0, 0);  end;  ///////////////////////////////////////////////////////////// end;end;end.highlightSyntax('delphimRjNjA','delphi');

- Может сначала посмотреть название окна которое появляется при MessageDlgВот код для сканирования всех окон:Код procedure TForm1.Button1Click(Sender: TObject);VAR  Wnd : hWnd;  buff: ARRAY [0..127] OF Char;begin  ListBox1.Clear;  // Получаем hWnd первого окна  Wnd := GetWindow(Handle, gw_HWndFirst);  // Цикл поиска окон  WHILE Wnd <> 0 DO BEGIN    IF (Wnd <> Application.Handle) AND // -Собственное окно       (IsWindowVisible(Wnd)) AND             // -Невидимые окна       (GetWindow(Wnd, gw_Owner) = 0) AND   // -Дочернии окна       (GetWindowText(Wnd, buff, sizeof(buff)) <> 0) // -Окна без заголовков    THEN BEGIN      GetWindowText(Wnd, buff, sizeof(buff));      ListBox1.Items.Add(StrPas(buff));    END;    // Ищем новое окно    Wnd := GetWindow(Wnd, gw_hWndNext);  END;end;highlightSyntax('delphi2YWFiN','delphi'); Это сообщение отредактировал SlaUr - 15.12.2004, 11:00

- Ну вывел он список окон:Global Mailtransport - Borland Delphi 2005 for Microsoft Windows - Unit1 [Running]Windows Commander 5.11 - TrendlineVPF::Как программно закрыть окно чужой программы? - Форум программистов VingradThe Bat!Program ManagerИ че?Дело в том что есть окно самой рограммы с заготовком Global Mail.И потом появляется MessageDlg или MessageBox с таким же заголовком где и нужно нажать кнопку ОК. Добавлено @ 12:04 Хм... че то я у себя не наблюдаю окна "Program Manager"... Это сообщение отредактировал andrey_post - 15.12.2004, 12:02

- Код  wnd2 := FindAWindow('Выборочный импорт', ''); //FindWindow (nil, 'Выборочный импорт');   if wnd2 = 0 then   ShowMessage('Окно выборочный импорт не найдено') else  begin   wndBtn := FindWindowEx (wnd2, 0, nil, 'Начать');   // имитируем клик мышкой   SendMessage(wndBtn, WM_LBUTTONDOWN, 0, 0);   SendMessage(wndBtn, WM_LBUTTONUP, 0, 0);  end;// ВОТ В ЭТОМ МЕСТЕ ПРОГА ЗАВИСАЕТ ПОКА НЕ НАЖМУ КНОПКУ "ОК"// КОТОРУЮ МНЕ И НУЖНО ПРОГРАММНО НАЖАТЬ// ПОСЛЕ НАЖАТИЯ ПРОДАЛЖАЕТСЯ ДВИЖЕНИЕ ПО КОДУ...highlightSyntax('delphiRhZmIx','delphi');

- Может я даю глупый совет но попробуйте закоментировать в выше приведенном коде "дочерние окна" ,тогда в листинге окон может появится то окно - оно ведь дочернее или я не прав?

- А может приложение ваще грохнуть?Вобщем ситуация такая. в оперделенное время нужно делать импорт или экспорт.Думаю дотель сделать такой.Таймер 1. Выключает таймер 2 Выполняет импорт Закрывает полностью используемое приложение Выключает таймер 1 (самого себя) Включает таймер 2Таймер 2. Выключает таймер 1 Выполняет экспорт Закрывает полностью используемое приложение Выключает таймер 2 (самого себя) Включает таймер 1Как приложение тогда грохнуть? Знаю только имя exe "globmail.exe" название окна Global MailПоскриптум:Сори админу за второй вопрос в топике! Это сообщение отредактировал andrey_post - 15.12.2004, 15:50

- может и глупо но непробовал Код GetActiveWindowhighlightSyntax('delphijgxMjI','delphi');а процесс убить можно так(лень править для конкретного случая ну я думаю смысл понятен)Код uses tlhelp32....function TerminateDBEngine(APath : PChar ) : boolean; StdCall;var  lSnapHandle, lProcHandle{, lTrayWindowHandle }: THandle;  ProcStruct : PROCESSENTRY32;  lProcessPath : String;  lBDEngineName : String;  lPath : String;  PID : Cardinal;  OSVerInfo: TOSVersionInfo;//  lCursorPos : TPoint;//  lTrayRect : TRect;begin  Result := false;  lSnapHandle := CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0);  if lSnapHandle = 0 then    exit;  ProcStruct.dwSize := sizeof( PROCESSENTRY32 );  OSVerInfo.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);  GetVersionEx(OSVerInfo);  case OSVerInfo.dwPlatformId of    VER_PLATFORM_WIN32_WINDOWS:    begin      lPath := APath;      if not IsPathDelimiter(APath,Length(lPath)) then      begin        SetLength(lPath,Length(lPath)+1);        lPath[Length(lPath)] := '\'      end;      lBDEngineName := 'DBEngine.exe'    end;    VER_PLATFORM_WIN32_NT:    begin      lPath := '';      lBDEngineName := 'DBEngine.exe';    end;  end;  if Process32First(lSnapHandle, ProcStruct) then  begin    try      repeat        lProcessPath := ProcStruct.szExeFile;        if uppercase(lProcessPath) = uppercase(lPath + lBDEngineName) then        begin          PID := ProcStruct.th32ProcessID;          lProcHandle := OpenProcess(PROCESS_TERMINATE, False, PID);          TerminateProcess(lProcHandle, 0);          WaitForSingleObject(lProcHandle, infinite);          CloseHandle(lProcHandle);          Result := true;        end;      until not Process32Next(lSnapHandle, ProcStruct);    finally      CloseHandle(lSnapHandle);    end;  end;end;highlightSyntax('delphiDllYzV','delphi');

- А если просто послать окну WM_CLOSE, что происходит? Кстати, чужому окну сообщения лучше посылать функцией PostMessage, а не SendMessage. В противном случае, если чужая программа висит, то повесится и твоя тоже.

- srdкак я понял у andrey_post проблема не в том как закрыть это окно а как получить его хендл.у меня была такаяже проблемма когда много окон с одинаковым заголовком, я обошелся GetActiveWindow потомучто нужно было закрывать только активное, если тебе это неподходить можно попробовать использовать FindWindow и по заголовку и по ClassName (вроде так можно), у MessageBoxа и главной програмой должны быть разными.

- Выяснилось: Главное окно: Класс: ThunderRT5Form Родительский класс: ThunderRT5FormОкно которе нужно закрыть: Класс: #32770 Родительский класс: ThunderRT5FormУ кнопки: Класс: Button Родительский класс: #32770И че щас делать?

Интернет казино     Онлайн игры     Увеличение члена     Купить DVD


Главная страница | opengl программирование | программирование бейсик | программирование интерфейса | программирование pocket | программирование заказы | задача динамического программирования | prolog программирование | стохастическое программирование | процедурное программирование | история языков программирования | структура программирования | языки программирования высокого уровня | программирование устройств | функции программирования | программирование siemens | списки программирование | язык программирования java | олимпиада программирование | программирование мобильных телефонов | дипломная работа программирование | программирование palm | Ссылки

Все про процедурное программирование