L'approccio semplice con il lancio di un nuovo processo utilizzando verbo "stampa" non funziona su Windows XP a tutti (si apre Visualizzatore immagini e fax invece della procedura guidata di stampa). Inoltre, non funziona come previsto su Windows 10 (al primo avvio viene aperto il selettore di app predefinito per le immagini, quindi viene aperto il visualizzatore di foto predefinito).
L'approccio corretto sarebbe utilizzare CLSID_PrintPhotosDropTarget oggetto COM. Il mio codice è in C++ (e ATL) ma spero che tu possa tradurlo in C#. I jast pass i nomi dei file, ma AFAIK è possibile passare direttamente le immagini direttamente senza scriverle su disco implementando l'interfaccia IDataObject
.
bool DisplaySystemPrintDialogForImage(const std::vector<CString>& files, HWND hwnd) {
static const CLSID CLSID_PrintPhotosDropTarget ={ 0x60fd46de, 0xf830, 0x4894, { 0xa6, 0x28, 0x6f, 0xa8, 0x1b, 0xc0, 0x19, 0x0d } };
CComPtr<IShellFolder> desktop; // namespace root for parsing the path
HRESULT hr = SHGetDesktopFolder(&desktop);
if (!SUCCEEDED(hr)) {
return false;
}
CComPtr<IShellItem> psi;
CComPtr<IDataObject> pDataObject;
std::vector<LPITEMIDLIST> list;
for (const auto& fileName : files) {
PIDLIST_RELATIVE newPIdL;
hr = desktop->ParseDisplayName(hwnd, nullptr, const_cast<LPWSTR>(static_cast<LPCTSTR>(fileName)), nullptr, &newPIdL, nullptr);
if (SUCCEEDED(hr)) {
list.push_back(newPIdL);
}
}
if (!list.empty()) {
hr = desktop->GetUIObjectOf(hwnd, list.size(), const_cast<LPCITEMIDLIST*>(&list[0]), IID_IDataObject, 0, reinterpret_cast<void**>(&pDataObject));
if (SUCCEEDED(hr)) {
// Create the Photo Printing Wizard drop target.
CComPtr<IDropTarget> spDropTarget;
hr = CoCreateInstance(CLSID_PrintPhotosDropTarget, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&spDropTarget));
if (SUCCEEDED(hr)) {
// Drop the data object onto the drop target.
POINTL pt = { 0 };
DWORD dwEffect = DROPEFFECT_LINK | DROPEFFECT_MOVE | DROPEFFECT_COPY;
spDropTarget->DragEnter(pDataObject, MK_LBUTTON, pt, &dwEffect);
spDropTarget->Drop(pDataObject, MK_LBUTTON, pt, &dwEffect);
return true;
}
}
}
return false;
}
Questo funziona benissimo per i documenti, ma non è l'ideale per le immagini. Vedi post modificato per lo screenshot di ciò di cui sto parlando. Preferibilmente mi piacerebbe usarlo con un oggetto Immagine piuttosto che dover scrivere l'immagine su disco e quindi chiamare la stampa. – SnakeByte
@SnakeByte - Ho aggiornato per abbinare la domanda aggiornata. –
Bello. Scriverò l'immagine solo su% temp%, quindi la cancellerò dopo. Bella soluzione, grazie e buona giornata. – SnakeByte