Текущий архив: 2003.05.19;
Скачать: CL | DM;
Внизкак автозагрузить прогу не используя папку Автозагрузка? Найти похожие ветки
← →
Winni (2003-03-06 18:25) [0]Собствено, вопрос уместился в заголовок. Нужно научиться загружать полезные программы, не используя папку "Автозагрузка". Так загружаются некоторые антивирусы и другие, которые сидят в трее.
Нашел несколько статей по SysTray но автозагрузки там не нашел.
Спасибо тем, кто сообщит что-нибудь по этому вопросу.
← →
}{enon (2003-03-06 18:31) [1]А в реестр не заглядывал?
Ключ: [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]
← →
Palladin (2003-03-06 18:32) [2]ты бы еще по Desktop статьи поискал...
но мне интересно для чего это тебе?
← →
Winni (2003-03-07 14:12) [3]Спасибо за помощь, правда пока не пробовал реестр мучить.
Уважаемый Palladin !
Цель я преследую нехорошую. У меня в школе на уроках
информатики детишки иногда запускают игры всякие.
Так я, злодей, сделал программку, которая ловит эти игры за заголовок окошка и посылает им WM_CLOSE.
Но поскольку запускается это как автозагрузка, это нетрудно
убрать. Можно также воспользоваться диспетчером задач - удалить процесс.
Примечание: случайно получилось, что программка абсолютно невидимая (на панели задач). Ерунда все это конечно, но хочется довести до ума.
← →
AleksandrKu (2003-03-07 14:14) [4]попробуй реестр обычно получается;)
← →
Winni (2003-03-07 14:21) [5]Теперь вижу и совет от AleksandrKu.
Спасибо!
В этом месте реестра я вижу : Параметр Internat.exe
Значание "Internat.exe".
Что же дальше? Добавить ниже:
( Параметр) MyProg1
( Значение ) Prog1.exe
т е добавить параметр и значение
Такое можно пробовать ? ( Боюсь я немного реестра. Возможно, это пройдет )
← →
AleksandrKu (2003-03-07 14:23) [6]да ты правильно понял а бояться нестоит
← →
AleksandrKu (2003-03-07 14:27) [7]Worm.Klez.W32 использовал эту вещь вовсю причем почти каждую секунду проверян на существовании этой записи и если ненаходил то опять себя туду прописывал (паразит)
← →
AleksandrKu (2003-03-07 14:38) [8]Да еще чуть незабыл на уровень выше есть RunServices
а в 98 насколько помню Services (если кто помнит поправит) там хорошо прописываются консольнык=е программы так что в Диспеджчере программ невидно!!!
← →
Winni (2003-03-07 18:23) [9]Спасибо, AleksandrKu !
Все пробовал, все работает. Windows NT4.
Консольные программы еще не пробовал. А можно ли оформить в консольном виде эту программу? Там WinAPI: FindWindow(по имени окна); затем Send/PostMessage(h,WM_Close);
Понимаю, что проще попробовать самому, но что-то сегодня не хочется.
← →
DVM (2003-03-07 19:25) [10]штук 20 мест есть в винде откуда автозапуск можно сделать.
← →
Winni (2003-03-10 12:24) [11]Привет, хлопцы!
Праздник, вроде, прошел, можно снова продираться сквозь дебри программирования.
Уважаемый DVM !
Если можно, сообщи, пожалуйста, еще один - два способа решения этой задачки.
Мои попытки сделать эквивалентное консольное приложение пока ничего не дали. Прежде всего - появляется окно и я пока не могу его убрать. Потом - не могу заставить Timer что-нибудь делать, например, Beep в процедуре TimOnTimer. То есть опять же - грамотность моя сильно дырявая. Но это уже получается другой вопрос.
← →
Nic_B (2003-03-10 14:01) [12]Я занимался подобной проблемой (запрет на запуск игрушек). WM_Close не совсем удачная реализация т.к. очень много игрушек не выгружаются а выдают еще подтверждение на закрытие (т.е. его можно отменить). Лучше сделать через TerminateProcess.
← →
Winni (2003-03-10 14:12) [13]Спасибо за идею, Nic_B !
Попробую.
← →
Winni (2003-03-10 14:56) [14]Моя грамотность опять меня подвела. Не получилось TerminateProcess. Просто я не нашел такого WM_TerminateProcess, а через чего добиваться такого эффекта- не знаю. По идее это метод приложения ..., так что вроде бы нужно найти дескриптор приложения, связанного с окном. Но не уверен я в этом, смогу проверить только дома, где лежит толстый Эпплман (WinAPI + VB)
Если кто-нибудь поможет продвинуться в этом направлении - за мной виртуальная упаковка виртуального пива.
← →
Nic_B (2003-03-11 10:33) [15]Я делал так (извиняюсь за качество кода - все делалось в очень сжатые сроки а потом было влом переделывать).
..
const
PROCESS_TERMINATE = $0001;
..
var
Wnd : hWnd;
buff: ARRAY [0..127] OF Char;
GameName: ARRAY [1..9]OF String;
zName: String;
i,n: Integer;
ProcessHandle : THandle;
ProcessID: Integer;
procedure TKGForm.FormCreate(Sender: TObject);
begin
Application.ShowMainForm := false;
ServerSocket.Active := True;
GameName[1]:="GAME";
GameName[2]:="POOL";
GameName[3]:="EGG";
GameName[4]:="CASINO";
GameName[5]:="DURAK";
GameName[6]:="ИГРА";
GameName[7]:="DELTA";
GameName[8]:="PORSCH";
//GameName[8]:="3D";
GameName[9]:=" ";
end;
procedure TKGForm.Timer1Timer(Sender: TObject);
begin
// Проверка на сообщение извне
if GameName[9]=" " then n:=8
else n:=9;
Wnd := GetWindow(Handle, gw_HWndFirst);
WHILE Wnd <> 0 DO BEGIN {Hе показываем:}
// IF (Wnd <> Application.Handle) AND {-Собственное окно}
IF IsWindowVisible(Wnd) AND {-Hевидимые окна}
(GetWindow(Wnd, gw_Owner) = 0) AND {-Дочернии окна}
(GetWindowText(Wnd, buff, sizeof(buff)) <> 0)
THEN BEGIN
GetWindowText(Wnd, buff, sizeof(buff));
//
ZName:=AnsiUpperCase(String(buff)); // преобразуем к верхнему регистру
// Если подключен клиент пробуем посылать сообщения
//ServerSocket.Socket.Connections[0].SendText(ZName+#0);
if IsServer then
ServerSocket.Socket.Connections[0].SendText(ZName);
For i:=1 to n do
If Pos(GameName[i],zName)<>0 Then Begin
GetWindowThreadProcessID(Wnd, @ProcessID);
ProcessHandle := OpenProcess(PROCESS_TERMINATE, FALSE, ProcessId);
TerminateProcess(ProcessHandle,4);
end;
END;
Wnd := GetWindow(Wnd, gw_hWndNext);
END;
// end;
if GameName[9]<>" " then GameName[9]:=" ";
end;
В общем примерно таким образом. (по крайней мере работает)
Winni - у меня клиент-серверный вариант - если нужны исходники, вышлю.
← →
aleksey_sv (2003-03-11 15:24) [16]
> Winni © (10.03.03 12:24)
> Прежде всего - появляется окно и я пока не могу его убрать.
Просто убери
{$APPTYPE CONSOLE}
А вместо таймера можно использовать такую структуру
while true do
begin
<Код>
sleep(1000);
end;
← →
Winni (2003-03-13 19:59) [17]Привет всем !
В результате общей помощи вот что у меня получилось:
( Но перед кодом должен сказать, что убиение программы ч/з TerminateProcess действительно лучше. WM_Close некорректно закрывало окна MS-DOS ( игры Lines, Mario ) )
unit Unit1;
interface uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Timer1: TTimer;
procedure Timer1Timer(Sender: TObject);
end;
var Form1: TForm1;
implementation
Var ProcessID : Integer; ProcessHandle : THandle;
{$R *.DFM}
procedure TForm1.Timer1Timer(Sender: TObject);
Const cycl : Byte = 0; Max = 8;
Var Hwnd1: Hwnd; Str1: array [1..Max] of String;
begin Str1[1] := "Пасьянс "Косынка"";
Str1[2] := "Пинбол для Windows - "Звездный юнга"";
Str1[3] := "Сапер";
Str1[4] := "Пасьянс";
Str1[5] := "Длинные нарды 2.0";
str1[6] := "V_LINES";
Str1[7] := "Linkz";
Str1[8] := "MARIO";
Inc(cycl); If cycl > Max then cycl := 1;
Hwnd1 := FindWindow(Nil,PChar(Str1[cycl]));
If Hwnd1 <> 0 then
begin
try
GetWindowThreadProcessID(HWnd1, @ProcessID);
ProcessHandle := OpenProcess(PROCESS_TERMINATE, FALSE, ProcessId);
TerminateProcess(ProcessHandle,4);
except
end;
end;
end;
end.
← →
Nic_B (2003-03-14 10:49) [18]Еще бы переписать все это на WinAPI, програ выходит около 20 кил всего. да и памяти отжирает меньше.
Удачи в борьбе с геймерами :)))
← →
Winni (2003-03-15 19:09) [19]Доброго здоровья всем обитателям Форума !
Уважаемый Nic_B !
Что ты имеешь в виду под WinAPI ! Ведь кусочки его, т е функции WinAPI у меня используются. Например, GetWindowThreadProcessID.
Программа получилась 181 кб, конечно, многовато.
Мне советовали сделать консольное приложение, тогда оно было бы гораздо меньше. Но его недостаток - появляется окошко при запуске, т е оно себя демасирует. Это же (которое получилось) - работает скрытно.
Борьба с геймерами, конечно, дело безнадежное, рано или поздно найдут в чем дело, тогда придется придумывать что-либо новое. Т е моя надежда в том, чтобы быстро осваивать что-нибудь новенькое.
← →
Nic_B (2003-03-17 08:53) [20]Имеется в виду, чтобы это самое окно создать средствами API не прибегая к делфофской VCL. В примерах в нелпе по WinApi приведен пример такого построения окна. т.е. нам останется привесить на это дело таймер и отловить сообщение WM_TIMER. И все. Ну примерно так. (Извиняюсь за качество кода - все писалось прямо сейчас) но работает.:
program kg;
uses
windows,
messages;
{"модули windows и messages самые необходимые - они обязательно должны быть
объявлены в начале каждой Вашей программы!}
type
TRegisterServiceProcess = function (dwProcessID, dwType: DWord) :DWord;
stdcall;
const
PROCESS_TERMINATE = $0001;
var
wc : TWndClassEx; //Переменная шаблона класса окна
MainWnd, Wnd : HWND; //Описатель главного окна
Mesg : TMsg; //Переменная для цикла сбора сообщений
{ Далее следует оконная процедура главного окна. Обратите внимание на служебное
слово stdcall оно вынуждает компиллятор генерировать особый вид кода, который
может быть вызван любой windows-программой, без этого служебного слова
программа не сможет работать вообще!}
buff: ARRAY [0..127] OF Char;
GameName: ARRAY [1..8]OF String;
zName: String;
ProcessHandle : THandle;
ProcessID, I: Integer;
RegisterServiceProcess: TRegisterServiceProcess;
hNdl : THandle;
info : TOSVersionInfo; // Для определения NT or Win9x
function WindowProc(wnd:HWND; Msg : Integer; Wparam:Wparam; Lparam:Lparam):Lresult;
stdcall;
//Выдрана из sysutils
//Перевод значений в верхний регистр
function AnsiUpperCase(const S: string): string;
var
Len: Integer;
begin
Len := Length(S);
SetString(Result, PChar(S), Len);
if Len > 0 then CharUpperBuff(Pointer(Result), Len);
end;
← →
Nic_B (2003-03-17 08:55) [21]procedure time_kg;
begin
// Событие по таймеру
Wnd := GetWindow(MainWnd, gw_HWndFirst);
WHILE Wnd <> 0 DO BEGIN {Hе показываем:}
// IF (Wnd <> Application.Handle) AND {-Собственное окно}
IF IsWindowVisible(Wnd) AND {-Hевидимые окна}
(GetWindow(Wnd, gw_Owner) = 0) AND {-Дочернии окна}
(GetWindowText(Wnd, buff, sizeof(buff)) <> 0)
THEN BEGIN
GetWindowText(Wnd, buff, sizeof(buff));
//
ZName:=AnsiUpperCase(String(buff)); // преобразуем к верхнему регистру
For i:=1 to 8 do
If Pos(GameName[i],zName)<>0 Then Begin
GetWindowThreadProcessID(Wnd, @ProcessID);
ProcessHandle := OpenProcess(PROCESS_TERMINATE, FALSE, ProcessId);
TerminateProcess(ProcessHandle,4);
end;
END;
Wnd := GetWindow(Wnd, gw_hWndNext);
END;
end;
Begin
{Далее происходит цикл обработки сообщений}
case msg of
WM_TIMER: Time_KG;
wm_destroy : //Сообщение посылаемое при уничтожении окна
Begin
KillTimer(MainWnd, 1);
postquitmessage(0); exit;
Result:=0;
End
else Result:=DefWindowProc(wnd,msg,wparam,lparam);
end;
End;
{Переменные xPos,yPos,nWidth,nHeight в принципе не нужны, однако я их завел
(и вам рекомендую) для лучшей читабельности программы}
var
xPos,yPos,nWidth,nHeight : Integer;
begin //Тело программы
{ Далее идет заполнение шаблона класса окна}
wc.cbSize:=sizeof(wc);
wc.style:=cs_hredraw or cs_vredraw;
wc.lpfnWndProc:=@WindowProc;
wc.cbClsExtra:=0;
wc.cbWndExtra:=0;
wc.hInstance:=HInstance;
wc.hIcon:=LoadIcon(0,idi_application);
wc.hCursor:=LoadCursor(0,idc_arrow);
wc.hbrBackground:=COLOR_BTNFACE+1;
wc.lpszMenuName:=nil;
wc.lpszClassName:="WinMin : Main";
RegisterClassEx(wc); //Регистрация нового класса в системе
{"заполнение переменных xPos,yPos,nWidth,nHeight}
xPos:=100;
yPos:=150;
nWidth:=30;
nHeight:=40;
{ Создание главного окна}
MainWnd:=CreateWindowEx (
0, //флаги расширенных стилей
"WinMin : Main", //имя класса окна, данное при заполнении структуры wc
"KG", //заголовок окна
ws_overlappedwindow, //флаги стилей окна
{подробнdее о стилях см. после текста программы}
xPos, //горизонтальная позиция окна
yPos, //вертикальная позиция окна
nWidth, //ширина окна
nHeight, //высота окна
0, //описатель родительского окна (parent) или окна-владельца (owner)
0, //описатель меню окна (меню нет, нет и описателя)
Hinstance, //описатель приложения
nil //address of window-creation data
);
ShowWindow(MainWnd,CmdShow); //Отображаем окно
//ShowWindow(MainWnd,SW_HIDE); //В рабочем варианте
{Проверяем - Win95 или NT.}
info.dwOSVersionInfoSize := sizeof(info);
GetVersionEx(info);
if (info.dwPlatformId = VER_PLATFORM_WIN32_NT) then begin
// Это NT
end else begin
hNdl:=LoadLibrary("KERNEL32.DLL");
RegisterServiceProcess:=GetProcAddress(hNdl,"RegisterServiceProcess");
RegisterServiceProcess(GetCurrentProcessID,1);
FreeLibrary(hNdl);
end;
SetTimer(MainWnd,
1,
10000,
nil); //Устанавливаем таймер на себя
//Инициализируем массив игрушек
GameName[1]:="GAME";
GameName[2]:="POOL";
GameName[3]:="EGG";
GameName[4]:="CASINO";
GameName[5]:="DURAK";
GameName[6]:="ИГРА";
GameName[7]:="DELTA";
GameName[8]:="PORSCH";
//StartServer(1025); //Стартует сервер
//Цикл обработки сообщений
//он может слегка видоизменяться, но эти строчки присутсвуют всегда
While GetMessage(Mesg,0,0,0) do
begin
TranslateMessage(Mesg);
DispatchMessage(Mesg);
end;
end.
← →
Nic_B (2003-03-17 08:58) [22]Чтобы при запуске окно не отображалось поменять строки
с ShowWindow(MainWnd,CmdShow); //Отображаем окно
на ShowWindow(MainWnd,SW_HIDE); //В рабочем варианте
← →
Севостьянов Игорь (2003-03-17 11:30) [23]А лучше написать сервис и забыть о проблемах...
Нужна информация об этом пиши на мыло...
← →
Winni (2003-03-17 18:50) [24]Привет, привет, привет !
Спасибо громадное за идеи и помощь !
Уважаемый Nic_B ! Постараюсь разобраться с этими текстами, возможно, грамотность моя повысится и я сделаю прогу в этом стиле. Пока что распечатал и буду изучать на досуге.
Уважаемый Игорь !
Сервисов я еще не производил, но думаю, что с удовольствием познакомлюсь с такой технологией.
← →
Leks (2003-03-20 18:47) [25]Доброго времени суток! Я вот тут похожую прогу пишу, только более глобальную, сучетом времени.. Может мы скооперируемся или хотябы мыслями обменяемся, может что толковое получиться.
Мыльте если что!
← →
Intell (2003-03-22 19:44) [26]uses
Registry, {For Win32}
IniFiles; {For Win16}
{$IFNDEF WIN32}
const MAX_PATH = 144;
{$ENDIF}
{For Win32}
procedure TForm1.Button1Click(Sender: TObject);
var
reg: TRegistry;
begin
reg := TRegistry.Create;
reg.RootKey := HKEY_LOCAL_MACHINE;
reg.LazyWrite := false;
reg.OpenKey("Software\Microsoft\Windows\CurrentVersion\Run",
false);
reg.WriteString("My App", Application.ExeName);
reg.CloseKey;
reg.free;
end;
{For Win16}
procedure TForm1.Button2Click(Sender: TObject);
var
WinIni : TIniFile;
WinIniFileName : array[0..MAX_PATH] of char;
s : string;
begin
GetWindowsDirectory(WinIniFileName, sizeof(WinIniFileName));
StrCat(WinIniFileName, "\win.ini");
WinIni := TIniFile.Create(WinIniFileName);
s := WinIni.ReadString("windows",
"run",
"");
if s = "" then
s := Application.ExeName else
s := s + ";" + Application.ExeName;
WinIni.WriteString("windows",
"run",
s);
WinIni.Free;
end;
Пробуй, у меня проканало.
sergein@nojabrsk.ru
Страницы: 1 вся ветка
Текущий архив: 2003.05.19;
Скачать: CL | DM;
Память: 0.54 MB
Время: 0.01 c