在很多文件图标上点右键弹出菜单上有打印一项,这个是怎么来的,如何编程来识别某一文件是否有这一项,并且如果有这一项,后台打印该文件。最终目的是要一次性打印指定文件夹下的所有可打印文件。并且打印机是可以用参数指定的。
一般是根据扩展名来区分的,如果更严格一点需要判断文件格式。
只要指一下路径,就可以打印任何文件了!
Public Const SW_SHOWMINNOACTIVE = 7
Declare Function ShellExecuteAny Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hWnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As Any, ByVal lpDirectory As Any, ByVal nShowCmd As Long) As Long
Private Sub Form_Load()
Ret = ShellExecuteAny(me.hWnd , "print", path, ByVal 0&, ByVal 0&, SW_SHOWMINNOACTIVE)
End Sub
你可以把文件类型和对应打印机的信息写进ini文件,可以更新
比如
[Printer]
notepad=txt,cpp,log
或者
txt=notepad
cpp=notepad
log=notepad
另外设置一个默认的
这个变量可以直接用在批处理文件中
%SystemRoot%
编程来识别某一文件是否有打印这一项,可以找出它的扩展名,通过下面的程序来实现,它有Print和Printto两项
Option Explicit
Private Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long Note that if you declare the lpData parameter as String, you must pass it By Value.
Private Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
Private Const HKEY_CLASSES_ROOT = &H80000000
Private Declare Function RegQueryInfoKey Lib "advapi32.dll" Alias "RegQueryInfoKeyA" (ByVal hKey As Long, ByVal lpClass As String, lpcbClass As Long, ByVal lpReserved As Long, lpcSubKeys As Long, lpcbMaxSubKeyLen As Long, lpcbMaxClassLen As Long, lpcValues As Long, lpcbMaxValueNameLen As Long, lpcbMaxValueLen As Long, lpcbSecurityDescriptor As Long, lpftLastWriteTime As FILETIME) As Long
Private Declare Function RegEnumKey Lib "advapi32.dll" Alias "RegEnumKeyA" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpName As String, ByVal cbName As Long) As Long
Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
Private Type FILETIME
dwLowDateTime As Long
dwHighDateTime As Long
End Type
Private Sub SetExtOperation(ByVal ext As String) ext传入扩展名如".txt"
Dim hKey As Long, typeData As Long, lenData As Long
Dim S As String, ret As Long, Name As String, Idx As Long
Dim nSubKey As Long, maxSubKeyLen As Long, maxClassLen As Long
Dim nValue As Long, maxValueNameLen As Long, maxValueLen As Long
Dim sd As Long, WriteTime As FILETIME
List1.Clear
ret = RegOpenKey(HKEY_CLASSES_ROOT, ext, hKey)
If ret <> 0 Then Exit Sub
ret = RegQueryValueEx(hKey, "", 0, typeData, ByVal vbNullString, lenData)
If ret = 0 Then
S = String(lenData, Chr(0))
RegQueryValueEx hKey, "", ByVal 0, typeData, ByVal S, lenData
S = Left(S, InStr(S, Chr(0)) - 1)
ret = RegOpenKey(HKEY_CLASSES_ROOT, S & "\shell", hKey)
If ret <> 0 Then Exit Sub
ret = RegQueryInfoKey(hKey, vbNullString, 0, ByVal 0, nSubKey, maxSubKeyLen, maxClassLen, nValue, maxValueNameLen, maxValueLen, sd, WriteTime)
Name = String(maxSubKeyLen + 1, Chr(0))
For Idx = 0 To nSubKey - 1
ret = RegEnumKey(hKey, Idx, Name, Len(Name))
If ret = 0 Then
List1.AddItem Left(Name, InStr(Name, Chr(0)) - 1)
End If
Next
End If
RegCloseKey hKey
End Sub
Private Sub Command2_Click()
SetExtOperation ".PDF"
End Sub