| Структура программирования, программирование, языки программирования, книги программирование | На сайте представлена информация про программирование в Интернете и работу |
|
Какой версией 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
- Выскакивает 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И че щас делать? |