Доброе время суток эксперты.Я к сожалению пока не очень хорошо знаю ассемблер и винапи для того ,чтобы из одной программы на делфи убрать переодически всплывающее окно с рекламой. Прога бесплатная,а это окошко порядком надоело. С помощью редактора ресурсов я получил форму этого окна. А теперь вопрос можно ли сделать так,чтобы когда это окно появится,то оно сразу получило сообщение о нажатии кнопки ОК закрывающее окно.Программа Кто хочет стать миллионером. Ресурс в приложении.Я не думал ,что токомпилятор делфи работает так компактно:в программе всего два раза вызывается API CreateWindowEx,а окон создается гораздо больше,наверное просто с разных мест проги функции передаются разные параметры для создания того или иного окна.
Добрый день, Yury! Так я не понял у вас исходники этой проги? если да то из проекта можно убрать окно, а если нет то как же вы хотите убрать окно из екзешниа Ответ отправлен: 07.10.2003, 09:35 Отправитель: Cybernetic Creature Отвечает Boriss
Здравствуйте, Yury!
Ответ отправлен: 06.10.2003, 12:07 Отправитель: Boriss Отвечает Marouder
Добрый день, Yury! Нет. Нельзя так сделать. Ответ отправлен: 06.10.2003, 14:01 Отправитель: Marouder Отвечает _vt
Доброе время суток, Yury! > С помощью редактора ресурсов я получил форму этого окна. Если ты смог это сделать, получается что программа вообще никак не защищена и из ресурсов эту форму можно просто удалить...
*** E-Man - we are waiting for you ***
Ответ отправлен: 06.10.2003, 01:55 Отправитель: _vt Отвечает Bob Johnson
Приветствую Вас, Yury! Изменением ресурса ты только покарежешь саму программу, но кнопку не нажмешь. Единственное, можно попробовать подставить в Form::OnCreate обработчик Button1Click. Т.е. как только форма появляется, вызывается процедура как бы нажатия кнопки. Но как это кодируется в ресурсах - не могу так сказать. Создай простое приложение с формой и кнопкой, в которой на OnCreate (или OnShow) будет привешен обработчик этой кнопки и посмотри.
* EMan1.5: ---===*** The game we play ***===---
Ответ отправлен: 07.10.2003, 23:18 Отправитель: Bob Johnson
Вопрос № 996
Здравствуйте! Можно как-нибудь определить какие команды отправляет программа на устройство подключенное к com-порту??
Доброе время суток, NAU! Вне всякого сомнения можно. Нужно просто читать с сом-порта. Ответ отправлен: 07.10.2003, 11:19 Отправитель: sir henry Отвечает Cybernetic Creature
Доброе время суток, NAU! procedure TForm1.Button1Click(Sender: TObject); var CommPort: string; hCommFile: THandle; Buffer: PCommConfig; size: DWORD; begin CommPort := 'COM1'; {Открываем Com-порт} hCommFile := CreateFile(PChar(CommPort), GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); if hCommFile = INVALID_HANDLE_VALUE then begin ShowMessage('Unable to open ' + CommPort); exit; end; {Выделяем временный буфер} GetMem(Buffer, sizeof(TCommConfig)); {Получаем размер структуры CommConfig} size := 0; GetCommConfig(hCommFile, Buffer^, size); {Освобождаем временный буфер} FreeMem(Buffer, sizeof(TCommConfig)); {Выделяем память для структуры CommConfig} GetMem(Buffer, size); GetCommConfig(hCommFile, Buffer^, size); {Изменяем скорость
передачи} Buffer^.dcb.BaudRate := 1200; {Устанавливаем новую конфигурацию для COM-порта} SetCommConfig(hCommFile, Buffer^, size); {Освобождаем буфер} FreeMem(Buffer, size); {Закрываем COM-порт} CloseHandle(hCommFile); end; После открытия com-порта через CreateFile() необходимо с помощью GetCommState() и SetCommState() установить параметры порта (в частности убрать автоуправление RTS и DTR). Затем для установки соответствующих сигналов используется функция EscapeCommFunction().
Procedure ControlRTS; Var S: String; lDCB: TDCB; fHandle: THandle; Begin S:='COM1'; // open port fHandle:=CreateFile( Pchar(S), GENERIC_READ Or GENERIC_WRITE, 0, Nil, OPEN_EXISTING, 0, 0); If fHandle=INVALID_HANDLE_VALUE Then Begin // can't open.... Exit; End; // read settings If Not GetCommState(
fHandle, lDCB) Then Begin // can't read Exit; End; // Fill dcb lDCB.BaudRate:=CBR_2400; lDCB.ByteSize:=8; lDCB.Parity:=NOPARITY; lDCB.StopBits:=ONESTOPBIT; // !!! we will manage RTS ourself !!! ldcb.Flags:=(ldcb.Flags And $FFFFC0FF) Or $00000100; // set comm state SetCommState( fHandle, ldcb); // Here we can manage // Reset RTS EscapeCommFunction( fHandle, CLRRTS); // Set RTS EscapeCommFunction( fHandle, SETRTS); // Close port CloseHandle(fHandle); fHandle:=0; End;
P.S. Надо заметить, что все выходы com-порта являются инверсными. А это значит, что активным сосотоянием порта является 0, а неактивным 1.
Ответ отправлен: 07.10.2003, 09:35 Отправитель: Cybernetic Creature Отвечает Boriss
Здравствуйте, NAU! В какой среде? Какая программа - своя или чужая? SoftIce может Ответ отправлен: 06.10.2003, 12:14 Отправитель: Boriss Отвечает Bob Johnson
Доброе время суток, NAU! Вроде есть такая прога как portmon от sysinternal.com
* EMan1.5: ---===*** The game we play ***===---
Ответ отправлен: 07.10.2003, 23:20 Отправитель: Bob Johnson
Вопрос № 997
Здравствуйте уважаемые Експерты! Методом "тыка" что-то не выходит. Возможно ли так сделать (специально для CJ - если да, то как?) - глобальный на приложение TTHread. Есть несколько форм, у каждой из которых есть процедура, которая выполняется определённый момент времени (без параметров). В каждой форме нужно создать потомок потока с передачей ему процедуры, которую он запустит в Execute. При необходимости его закрыть. Что-то у меня трабла с передачей процедуры. В крайнем случае, некоторые из Вас ассемблерщики, как передать адрес процедуры, и как в Thread будет выглядеть ассемблерный код на call этой процедуры? Хотя бы мысли plees. C ув. Игорь.
Приветствую Вас, Игорь! Если я правильно понял, тебе надовызвать процедуру из другой формы? Почему именно так! Было-бы проще или создать dll или все процедуры впихнуть в главную форму! А вот с TTHread чуть-чуть не понятно! И почему ты выбрал именно меня? Ответ отправлен: 07.10.2003, 21:41 Отправитель: CJ Отвечает sir henry
Приветствую Вас, Игорь! 1. Не совсем понятно - "глобальный" что? :) 2. Передавать процедуру можно передавая ее адрес: MyProc: procedure; ... SecondProc(@MyProc); ... Ответ отправлен: 07.10.2003, 10:57 Отправитель: sir henry Отвечает Bob Johnson
Доброе время суток, Игорь! Процедура передается только ее адресом. Возможно в дельфи как-то туго с передачей адресов процедур. В асме при вызове функции CreateThread (а именно она и создает поток) ей передается именно указатель на процедуру. Описание функции и соотв. процедуры есть в win 32 prog ref, которое поставляется с дельфи (только оно на с++). Я бы использовал функцию напрямую unless не надо вызывать в качестве процедуры потока метод класса. В последнем случае придется писать заглушку, т.к. метод класса можно вызывать только из класса или у конкретного экземпляра (т.е. ему еще надо передать указатель на экземпляр класса).
* EMan1.5: ---===*** The game we play ***===---
Ответ отправлен: 07.10.2003, 23:22 Отправитель: Bob Johnson Отвечает Cybernetic Creature
Добрый день, Игорь! К примеру, функция "прослушивает" каталог на предмет файлов. Если находит, то создает нить, которая будет обрабатывать файл. Потомку надо передать имя файла, а вот как? Странный вопрос. Я бы понял, если бы требовалось передавать данные во время работы нити. А так обычно поступают следующим образом. В объект нити, происходящий от TThread дописывают поля. Как правило, в секцию PRIVATE. Затем переопределяют конструктор CREATE, который, принимая необходимые параметры заполняет соответствующие поля. А уже в методе EXECUTE легко можно пользоваться данными, переданными ей при его создании.
Ответ отправлен: 09.10.2003, 18:37 Отправитель: Cybernetic Creature
Вопрос № 998
Skolko raz ya moqu sprashivat, vi chto ne znayete skolko budet 2*2 ?... shuchu! Pojaluysta... pomogite... !!! ... Problema: __Napisal progu s QuickReport. Vse rabotayet! Tolko progu nujno stavit na komp qde nikoqda ne bival Delphi i yego komponenti. Vopros: __Kak mne ustanovit QR na etot komp?
Приветствую Вас, Dash-Shaggy! Что есть QR? Ну а чтобы программа работала на других компах, не надо испльзовать дополнительные библиотеки! Ответ отправлен: 07.10.2003, 21:41 Отправитель: CJ Отвечает sir henry
Добрый день, Dash-Shaggy! По отношению QR ничего дополнительно ставить не надо. Все что нужно, будет входить в состав программы. А вот BDE (если Ваша прога работает с данными через BDE) несомненно нужно будет поставить :). Ответ отправлен: 07.10.2003, 11:09 Отправитель: sir henry Отвечает Cybernetic Creature
Приветствую Вас, Dash-Shaggy! Mojno v Delphi nije versii 6 Ответ отправлен: 09.10.2003, 18:37 Отправитель: Cybernetic Creature
Вопрос № 999
Привет, эксперты! есть некая фигура, нарисованная в TPaintbox (к примеру, пятиконечная звезда) как ее повращать? как изменять скорость вращения??
Приветствую Вас, Эланор! Rabotayem s pikselyami... PaintBox1.Pixels[x,y]
Ответ отправлен: 08.10.2003, 09:39 Отправитель: THE_PRO Отвечает Boriss
Приветствую Вас, Эланор! По-видимому, только программно перерисовывать. Например, по таймеру, пересчитывать координаты пикселов изображения (матрица поворотов) и заново через Canvas.pixels[x,y] Ответ отправлен: 08.10.2003, 13:18 Отправитель: Boriss Отвечает CJ
Доброе время суток, Эланор! Просто не сделаешь!!! Можно поробывать нарисовать много кадров, а потом загружать их через определенное время в компоненте! Ответ отправлен: 07.10.2003, 21:40 Отправитель: CJ Отвечает sir henry
Доброе время суток, Эланор! А Вы обычный графический компонент не путаете с OpenGL? :) Шутка :). А если серьезно, то вращать или делать что-то еще можно перерисовкой фигуры. Ответ отправлен: 07.10.2003, 13:03 Отправитель: sir henry Отвечает Bob Johnson
Здравствуйте, Эланор! Надо написать процедуру, которая будет ее рисовать с заданным углом поворота. Для звезды достаточно просто - ведь она имеет всего лишь 5 точек, равномерно распределенных в пределах полного оборота (два пи радиан). Просто добавь некоторый начальный угол. А скорость вращения - это изменение этого угла поворота во времени.
* EMan1.5: ---===*** The game we play ***===---
Ответ отправлен: 07.10.2003, 23:23 Отправитель: Bob Johnson Отвечает Cybernetic Creature
Доброе время суток, Эланор! Как повернуть Bitmap на любой угол --------------------------------------------------------------------------------
const PixelMax = 32768; type pPixelArray = ^TPixelArray; TPixelArray = array [0..PixelMax-1] of TRGBTriple; procedure RotateBitmap_ads(SourceBitmap: TBitmap; out DestBitmap: TBitmap; Center: TPoint; Angle: Double); var cosRadians : Double; inX : Integer; inXOriginal : Integer; inXPrime : Integer; inXPrimeRotated : Integer; inY : Integer; inYOriginal : Integer; inYPrime : Integer; inYPrimeRotated : Integer; OriginalRow : pPixelArray; Radians : Double; RotatedRow : pPixelArray; sinRadians : Double; begin DestBitmap.Width := SourceBitmap.Width; DestBitmap.Height := SourceBitmap.Height; DestBitmap.PixelFormat
:= pf24bit; Radians := -(Angle) * PI / 180; sinRadians := Sin(Radians); cosRadians := Cos(Radians); for inX := DestBitmap.Height-1 downto 0 do begin RotatedRow := DestBitmap.Scanline[inX]; inXPrime := 2*(inX - Center.y) + 1; for inY := DestBitmap.Width-1 downto 0 do begin inYPrime := 2*(inY - Center.x) + 1; inYPrimeRotated := Round(inYPrime * CosRadians - inXPrime * sinRadians); inXPrimeRotated := Round(inYPrime * sinRadians + inXPrime * cosRadians); inYOriginal := (inYPrimeRotated - 1) div 2 + Center.x; inXOriginal := (inXPrimeRotated - 1) div 2 + Center.y; if (inYOriginal >= 0) and (inYOriginal <= SourceBitmap.Width-1) and (inXOriginal >= 0) and (inXOriginal <= SourceBitmap.Height-1) then begin OriginalRow := SourceBitmap.Scanline[inXOriginal];
RotatedRow[inY] := OriginalRow[inYOriginal] end else begin RotatedRow[inY].rgbtBlue := 255; RotatedRow[inY].rgbtGreen := 0; RotatedRow[inY].rgbtRed := 0 end; end; end; end; {Usage:} procedure TForm1.Button1Click(Sender: TObject); var Center : TPoint; Bitmap : TBitmap; begin Bitmap := TBitmap.Create; try Center.y := (Image.Height div 2)+20; Center.x := (Image.Width div 2)+0; RotateBitmap_ads( Image.Picture.Bitmap, Bitmap, Center, Angle); Angle := Angle + 15; Image2.Picture.Bitmap.Assign(Bitmap); finally Bitmap.Free; end; end;
Ответ отправлен: 09.10.2003, 18:37 Отправитель: Cybernetic Creature
Форма отправки вопроса
Внимание!
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+
или отправлять вопросы с сайта по адресу:
http://rusfaq.ru/cgi-bin/Message.cgi.