Форум: "WinAPI";
Текущий архив: 2004.08.15;
Скачать: [xml.tar.bz2];
ВнизКак поставить хук на spoolsv.exe ? Найти похожие ветки
← →
Vlad_ua © (2004-06-18 18:44) [0]Как отловить момент что принтер отпечатал страницу и после этого
события выполнить свой код ?
Заранее благодарен .....
← →
juiceman (2004-06-22 11:50) [1]Присоседюсь со своим вопросом, если не возражаете. Действительно, как контролировать печать локального принтера, т.е. считать из своей прораммы количество печатаемых страниц ?
← →
Петров Денис © (2004-06-22 11:59) [2]См.:
FindFirstPrinterChangeNotification
FindNextPrinterChangeNotification
FindClosePrinterChangeNotification
← →
andry (2004-06-28 17:49) [3]Удалено модератором
Примечание: Правила читаем
← →
Rem (2004-06-28 19:19) [4]Cообщение WM_SPOOLERSTATUS.
Для тех, кому непонятно:
TForm1 = class(TForm)
...
private
procedure WMSpoolerStatus(var Msg: TMessage); message WM_SPOOLERSTATUS; // это пишем сами, руками; Delphi IDE этого за Вас не напишет
end;
procedure TForm1.WMSpoolerStatus(var Msg: TMessage); // и это тоже сами пишем
begin
ShowMessage("Принтер что-то печатает!");
// EnumJobs(...);
end;
2 andry
Шановний, я, звiсно, поважаю ваше право писати що Вам забажаеться, проте клавiшу F1 ще нiхто не вiдмiняв...
Крiм того, читайте правила користування форумом...
P.S. Если возникают такие трудности (особенно по F1), то задумайтесь: не слишком ли рано Вы в WinAPI забрались?
← →
andry (2004-06-30 18:05) [5]Удалено модератором
Примечание: Правила читаем
← →
Петров Денис © (2004-06-30 18:19) [6]> andry (28.06.04 17:49) [3]
А меня расстраивают люди, которые не могут открыть MSDN, прочитать описание функции и при этом пытаются писать такие штуки, как сервисы.
Согласен с Rem - а не рановато ли за такие задачи браться?
А если оставить ругань в стороне, то ответь на такой вопрос: ты умеешь пользоваться wait-функциями?
← →
andry (2004-06-30 21:03) [7]Удалено модератором
Примечание: Правила читаем
← →
Петров Денис © (2004-07-01 10:42) [8]> А тепер про сервіси на delphi 7 вибираєш ApplicationServise
> і все сервіс готов!!!
Наивный. Это - шаблон сервиса. Функциональности у него ноль, разве что запустить и остановить можно. Тут треть участников форма тебе на WinAPI точно такой же напишет за 5 минут, а толку?
> дехто каже що з системною учотною записю не поличиться получити
> Handle принтера
Врут. Например, такой код работает:
procedure TService1.ServiceExecute(Sender: TService);
var
hPrinter: Cardinal;
begin
if OpenPrinter(nil, hPrinter, nil) then
begin
while not Terminated do
ServiceThread.ProcessRequests(True);
ClosePrinter(hPrinter);
end;
end;
Сервис стартует с системной учетной записью. Кстати, а что может помешать изменить учетную запись для запуска сервиса?
Кстати, ты не ответил на вопрос про wait-функции...
← →
andry (2004-07-01 11:08) [9]Удалено модератором
Примечание: Правила читаем
← →
andry (2004-07-01 11:24) [10]ну мене переконувли що системною запис.. не доберешся до принтера але я провірив декілька програмок того типу деякі навіть на депфі написані через eXeScope 6.30 виявляються вони використовують ті сам іфункції типа FindFirstPrinterChangeNotification що і я тепер треба подумати як передати цей hPrinter в компонент, а ти провіряв воно точно паше бо мене переконували справжній гуру що отриамати hPrint неможливо!!!
← →
Петров Денис © (2004-07-01 11:36) [11]> andry (01.07.04 11:08) [9]
Все в перемешку.
Во-первых, заставлять работать компонент стороннего разработчика - это не сюда.
Во-вторых, код, приведенный выше, РАБОТАЕТ, если сервис стартует с системной учетной записью.
В-третьих, общий алгоритм работы с уведомлениями, получаемыми от принтера, такой:
1. Создаешь в приложении отдельный поток. Все дальнейшие действия относятся к этому потоку.
2. Открываешь описатель принтера с помощью OpenPrinter
3. Создаешь описатель объекта-уведомления с помощью FindFirstPrinterChangeNotification с нужными тебе условиями мониторинга.
4. Организовываешь цикл до тех пор, пока поток не получит уведомление о завершении работы.
5. В цикле вызываешь одну из WAIT-функций, например, WaitForSingleObject с временем ожидания, НЕ равном INFINITE, передавая ей описатель, созданный FindFirstPrinterChangeNotification.
6. После выполнения WaitForSingleObject проверяешь ее результат. Только в том случае, если он равен WAIT_OBJECT_0, вызываешь FindNextPrinterChangeNotification и анализируешь полученное уведомление.
7. После завершения цикла закрываешь описатель объекта-уведомления с помощью FindClosePrinterChangeNotification.
8. Закрываешь описатель принтера.
9. Завершаешь работу потока.
← →
andry (2004-07-01 12:03) [12]Удалено модератором
Примечание: Правила читаем
← →
andry (2004-07-01 14:47) [13]ніяк не пойму чому ця функція
Function GetCurrentPrinterHandle: THandle;
Const
Defaults: TPrinterDefaults = (
pDatatype : nil;
pDevMode : nil;
DesiredAccess : PRINTER_ACCESS_USE or PRINTER_ACCESS_ADMINISTER );
Var
Device, Driver, Port : array[0..255] of char;
hDeviceMode: THandle;
Begin { GetCurrentPrinterHandle }
Printer.GetPrinter(Device, Driver, Port, hDeviceMode);
If not OpenPrinter(@Device, Result, @Defaults) Then
RaiseLastWin32Error;
End; { GetCurrentPrinterHandle }
не вертає значення CurrentPrinterHandle із сервиса з системною учотною записю
← →
Петров Денис © (2004-07-01 17:23) [14]> не вертає значення CurrentPrinterHandle із сервиса з
> системною учотною записю
Какой нафигPrinter.GetPrinter(Device, Driver, Port, hDeviceMode);
Я же привел пример:OpenPrinter(nil, hPrinter, nil)
В NT-системах у каждого пользователя есть свой профиль. В том числе, и у пользователя SYSTEM, от имени которого стартует по умолчанию сервис, созданный в Delphi. В профиль пользователя включаются, В ТОМ ЧИСЛЕ, и сведения об установленных принтерах.
Если у тебя под пользователем Administrator принтер HP1100 установлен, то это совсем не означает, что он установлен и для пользователя SYSTEM. Но для SYSTEM будет доступен локальный сервер печати. Вот ОН и открывается с помощью приведенной в примере строчки кода.
Оставляй свое мыло, пришлю пример использования FindFirstPrinterChangeNotification
FindNextPrinterChangeNotification
FindClosePrinterChangeNotification,
в форум его добавлять не хочется - слишком большой объем текста.
← →
andry (2004-07-01 18:25) [15]Удалено модератором
← →
Marser © (2004-07-01 20:52) [16]Удалено модератором
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.08.15;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.037 c