如題 ..
我是用 https://github.com/mtmsuhail/ESC-POS-USB-NET 裡面的 RawPrinterHelper.cs 部份程式碼來呼叫 WritePrinter 發送指令。
部份程式碼
[DllImport("winspool.Drv", EntryPoint = "WritePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool WritePrinter(IntPtr hPrinter, IntPtr pBytes, int dwCount, out int dwWritten);
但我不知道要怎麼接收 Orz
winspool.Drv 有提供一個 ReadPrinter 的方法,但找了一天沒見到有任何範例程式碼成功使用這個方法, stackoverflow 上面還是掛著這個問題,發問者也在其他很多地方問過都沒解答
假設不管上面這個方式,有其他方法可以對這種 USB POS Printer 收送指令嗎?
要收的資訊是票紙殘量警告,發送 "DLE EOT 4" 就會拿到回應…但不知道怎麼拿 T_T 很神奇的是這個功能應該蠻必要的,出單機快沒紙應該要通知不是嗎 .. 卻找不到答案
最後解決方案就是用序列通訊去問,只是要先改印表機佇列的通訊埠
修改印表機佇列通訊埠的程式碼參考範例如下
static public void SetPrinterPort(string printerName, string portName)
{
var oManagementScope = new ManagementScope(ManagementPath.DefaultPath);
oManagementScope.Connect();
SelectQuery oSelectQuery = new SelectQuery();
oSelectQuery.QueryString = @"SELECT * FROM Win32_Printer
WHERE Name = '" + printerName.Replace("\\", "\\\\") + "'";
ManagementObjectSearcher oObjectSearcher =
new ManagementObjectSearcher(oManagementScope, @oSelectQuery);
ManagementObjectCollection oObjectCollection = oObjectSearcher.Get();
foreach (ManagementObject oItem in oObjectCollection)
{
Console.WriteLine("oItem[Name]: " + oItem.Properties["Name"].Value.ToString());
Console.WriteLine("oItem[PortName]: " + oItem.Properties["PortName"].Value.ToString());
oItem.SetPropertyValue("PortName", portName + ":");
oItem.Put();
}
}