Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.038 c
1-1091359252
dracula
2004-08-01 15:20
2004.08.15
надо определить длину строки


3-1090567749
}|{yk
2004-07-23 11:29
2004.08.15
Глюк в FastReport 2.5


6-1086965732
Ded Moroz
2004-06-11 18:55
2004.08.15
Траффик


14-1090821412
Vlad Oshin
2004-07-26 09:56
2004.08.15
Повышать или не повышать приоритет процесса?


1-1091250542
А.Иванов
2004-07-31 09:09
2004.08.15
D7 и WinXp





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский