让打印机每分钟打印一张空白页

测试打印机:佳能2580s

测试系统:Microsoft Windows [版本 6.1.7601]

测试的语言:C/C++

g++版本:g++ (i686-posix-sjlj, built by strawberryperl.com project) 4.9.2

执行命令:

g++ -std=c++11 -Wall main.cpp -o main -lgdi32 -lwinspool -static-libgcc -static-libstdc++ -Wl,--enable-stdcall-fixup
#include <Windows.h>
#include <stdio.h>

// 手动声明动态加载的API函数
typedef BOOL (WINAPI *GetDefaultPrinterAFunc)(LPSTR, LPDWORD);
typedef HDC (WINAPI *CreateDCAFunc)(LPCSTR, LPCSTR, LPCSTR, const DEVMODEA*);
typedef int (WINAPI *StartDocAFunc)(HDC, const DOCINFOA*);

static GetDefaultPrinterAFunc pGetDefaultPrinterA = NULL;
static CreateDCAFunc pCreateDCA = NULL;
static StartDocAFunc pStartDocA = NULL;

int InitPrinter() {
    HMODULE hWinspool = LoadLibraryA("winspool.drv");
    HMODULE hGdi32 = LoadLibraryA("gdi32.dll");

    if (!hWinspool || !hGdi32) return 1;

    pGetDefaultPrinterA = (GetDefaultPrinterAFunc)GetProcAddress(hWinspool, "GetDefaultPrinterA");
    pCreateDCA = (CreateDCAFunc)GetProcAddress(hGdi32, "CreateDCA");
    pStartDocA = (StartDocAFunc)GetProcAddress(hGdi32, "StartDocA");

    if (!pGetDefaultPrinterA || !pCreateDCA || !pStartDocA) return 1;
    return 0;
}

int PrintBlankPage() {
    char szPrinter[256] = {0};
    DWORD dwSize = sizeof(szPrinter);
    HDC hdcPrinter = NULL;
    DOCINFOA di = { sizeof(DOCINFOA), "BlankPageJob", NULL };

    if (!pGetDefaultPrinterA(szPrinter, &dwSize)) return 1;

    hdcPrinter = pCreateDCA(NULL, szPrinter, NULL, NULL);
    if (!hdcPrinter) return 1;

    if (pStartDocA(hdcPrinter, &di) <= 0) {
        DeleteDC(hdcPrinter);
        return 1;
    }

    // 关键修改:创建空白页面
    StartPage(hdcPrinter); // 开始页面
    EndPage(hdcPrinter);   // 立即结束页面(无内容)
    EndDoc(hdcPrinter);
    DeleteDC(hdcPrinter);

    return 0;
}

int main() {
    if (InitPrinter() != 0) {
        printf("打印机初始化失败\n");
        return 1;
    }

    while (1) {
        if (PrintBlankPage() == 0) {
            printf("空白页已发送至打印机队列\n");
        } else {
            printf("错误:无法发送空白页\n");
        }
        Sleep(60000); // 保持60秒间隔
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值