プリンターの判断方法について

このQ&Aのポイント
  • 特殊な目的の為、文字列変数Deviceを受取り、その内容がプリンターを示すものであれば、APIのCreatDCでプリンターのHDCを作成します。
  • WINSPOOLである場合はプリンターと判断されますが、内容がNULL(空白)であればプリンターと判断すべきです。
  • ただし、具体的なプリンター名称である場合は判定が難しいため、別の手段が必要です。
回答を見る
  • ベストアンサー

プリンターであるか否かの判断?

特殊な目的の為、文字列変数Deviceを受取りその内容がプリンターを示すものであれば、APIのCreatDCでプリンターのHDCを作成します そしてそのプリンターのHDCを使用してStartDoc、StartPage、Textout等の一連の印刷動作をしたいと思います それには先ず文字列変数Deviceの内容がプリンターを示しているか? を判別しなくてはなりません 色々調べましたら WINSPOOL である場合はプリンターです 内容が NULL(空白)であればプリンターと判断すべきらしいです また内容が "ディスプレイ" ならば当然除外します しかしこんな判定法で宜しいのでしょうか? 特に文字列変数Deviceの内容が、コントロールパネル⇒デバイスとプリンター によって表示される Canon MP280 series Printer などの具体的なプリンター名称であった場合不安です 文字列変数Deviceの内容がプリンターを示しているか否かを判定するAPIなどはありませんが? また他の手段で簡単に判別する方法をご存知でしたら教えて下さい 宜しくお願い申し上げます

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

プリンターであればCreateDCするのですから, とりあえずCreateDCした後にGetDeviceCapsにTECHNOLOGY渡してDT_RASPRINTERかどうかを確かめる のが簡単な気がします。 違うのであれば,そのままDeleteDCすることになります。 文字列を直接調べているわけではないですが……。

sato-may
質問者

お礼

ありがとうございます 一発で難問解消いたしました 実は相当長い間悩んでおりました 大変助かりました ありがとうございました 今後も宜しくご指導願います

その他の回答 (1)

  • YUI_AI
  • ベストアンサー率45% (303/661)
回答No.1

下記URLの様にプリンタを列挙する事で対応出来ませんか http://support.microsoft.com/kb/158828/ja

sato-may
質問者

お礼

ありがとうございます OpenPrinter なるAPIがあることを初めて知りました 自分の浅学を恥じるばかりです、勉強になりました 今後、有効に使用させて頂きます ご指導ありがとうございました

関連するQ&A

  • StartPage(hdc)のhdcはプリンタだけ

    StartPage(hdc)のhdcは必ずプリンタですか? Windows API に StartPage(hdc)、 EndPage(hdc)があります hdcにはプリンタのデバイスコンテキストのハンドラーを指定します ここで逆説的な質問です 『StartPage、EndPageをAPIフックして捕まえたhdcは必ずプリンタもしくはプリンタコンパティブルのメモリーDCですか?』 プリンタ類似以外のデバイスにStartPage、EndPageのAPIが指定されることはありますか?

  • UNICODE指定のプロジェクトで関数Wの呼出し?

    .NET VC++で簡単な印刷プログラムを作りました hdc = CreateDC(TEXT("EPMJ3"), TEXT("Canon MP280 series Printer"), NULL, NULL);・・・(1) StartDoc(hdc, &docinfo);                           ・・・(2) StartPage(hdc); TextOut (hdc, 10, 200,L"テスト印刷の1行目です。", 12);           ・・・(3) TextOutW(hdc, 10, 100,L"テスト印刷の2行目です。", 12);           ・・・(4)  EndPage(hdc); EndDoc(hdc); DeleteDC(hdc); プロジェクトの文字コードはUNICODEを指定しております (1)はCreateDocW関数 (2)はStartDocW関数が呼ばれます (3)は当然TextOutW関数になるだろうと思っていたら、TextOutA関数が呼ばれいます 試しに(4)のように直接TextOutW関数を指定してみたら、これも結果に於いてTextOutA関数が呼ばれています    【以上の事柄はAPIフックを仕掛けて調べました】 なぜ私のコンパイラはUNICODE用のTextOut関数を呼出してくれないのですか????

  • プリンタBMP領域のサイズは?

    プリンタと同じメモリDCを作り、そこに書き込んだものをBitBltでコピーして印刷します ← サンプルのコードを参照させて頂きましたので多分間違えは無いと思います ところが確保すべきBMP領域(プリンタのサイズ)が分りません ?????????の箇所に設定すべき定数は何処を参照すれば良いのでしょうか? 困っております、ぜひご指導願います HDC hdc; DOCINFO docinfo; memset(&docinfo, 0, sizeof(DOCINFO)); docinfo.cbSize = sizeof(DOCINFO); docinfo.lpszDocName = L"testprint"; hdc = CreateDC(L"EPMJ3", L"Canon MP280 series Printer", NULL, NULL); StartDoc(hdc, &docinfo); StartPage(hdc); HDC hdcMem = CreateCompatibleDC (hdc); int Xsize = ???????????????? int Ysize = ???????????????? HBITMAP hDrawBmp =CreateCompatibleBitmap(hdc,Xsize,Ysize); SelectObject (hdcMem,hDrawBmp); TextOut(hdcMem, 0, 0 , L"プリンタのBMP領域の大きさは何処で分りますか?", 100); BitBlt(hdc, 0, 0,Xsize, Ysize, hdcMem, 0, 0, SRCCOPY); EndPage(hdc);

  • HDCを他の領域にコピーするには?

    HDC hdc = CreateDC("WINSPOOL","プリンタの名前",NULL,NULL); ....(1)プリンタのHDCの作成 HDC hdcMemDC = CreateCompatibleDC(hdc); ....(2)前者と同じ仕様のメモリーHDCの作成 hdcとhdcMemDCはハンドラへのポインタだと思います hdc ....(ポインタ)....... hdcの内容 (A) hdcMemDC ....ポインタ.......hdcMemDCの内容 (B) もしBをA領域に書き写せば TextOut(hdc,0,0,"メモリーDCに書き込めると思います",100); とするとプリンタにではなくメモリ-DCに書込むと思います   ⇒ BをAに書き写さずTextOut(hdcMeMDC,0,0,"メモリーDCに書き込めると思います",100);と同じ結果になるでしょう ところが『BをAに書き写す』方法が分かりません ハンドラの構成、サイズなどの資料を探しましたが適当なものが見つかりません ご存知でしたら教えてください 【追加説明】 TextOut(hdc,0,0,"メモリーDCに書き込めると思います",100); のステートメントを TextOut(hdcMeMDC,0,0,"メモリーDCに書き込めると思います,100); にするには一般的にはAPIフックが必要になります ⇒ もちろん全ソースの手修正でも可能ですが...... APIフックも手修正も回避したいのです

  • 出来上がった印刷イメージをボカす方法???

    .NETのC++を使用して印刷プログラムを組んでいます 定石通りに CreateDC StartDoc StartPage ・ ・ (1) ・ ・ EndPage  (2) EndDoc DeleteDC としております StartPageからEndPageの間の(1)の部分でベタベタと文字やイメージを書込んでいます 主題】 ⇒ 全てを書込んだ(2)の直前で作上げた印刷イメージ(文字、画像の全て)をハーフトーンにボカしたのです (1)の部分は複雑でもうこれ以上手を加えられません 各々のTextOut等のAPIの呼出し方法を修正せず、EndPageの直前で印刷イメージを一括してボカす方法があればご指導願います ??? 便利なAPIはありませんか ???

  • 初歩的なんですが…

    自分の母語はJavaなのですが、先日C++を始めました。 やっぱり似ているのでスイスイいけてはいたのですが 初歩的な所でつっかかりました… 自分でも調べたのですが、できないのかを調べるのことは難しくて… よかったら教えてください。。 Javaでは、例えば、 Method(String str, int num) で定義されたメソッドを呼ぶとき( aはint型の変数として適当な値が入っているとして) Method("文字" + a, 99); という感じで呼べます。≪"文字" + a≫が文字列として扱われるからなのですが、、 C++はこうゆうことができないのでしょうか? やりたいことを具体的に書きますと、 BOOL TextOut( HDC hdc, // デバイスコンテキストのハンドル int nXStart, // 開始位置(基準点)の x 座標 int nYStart, // 開始位置(基準点)の y 座標 LPCTSTR lpString, // 文字列 int cbString // 文字数 ); を呼ぶときに、 TextOut(hdc, 0, 0, a + "回", 3); という感じで呼びたいのですがもちろんダメです。 調べたところ、 wsprintf()を使って一旦別の変数に入れるという段階的な方法が見つかりました。でもこれだとなんかスマートな感じがしなくて、変数も消費してしまいますし… ダイレクトでJavaのようにすることはできないのでしょうか? 何かこういった場合に使える演算子などありませんでしょうか?

  • C言語で文字列バッファを消去する方法

    今、C言語とWin32 APIを使ってプログラミングをしています。 wsprintf(str,TEXT("プレイヤーの攻撃!")); TextOut(hdc,0,520,bstr,lstrlen(str)); if(ehp <= 0) {    wsprintf(str,TEXT("敵を倒しました"));    TextOut(hdc,0,520,bstr,lstrlen(str)); } このコードを実行すると、2回目のTextOutのところで 「敵をたおしました撃!」と出てしまいます。 きっとstrに以前の文字列が残っているからだと思いますが、 この保存した文字列を消去するにはどうしたらよいのでしょうか? for文でstr[0]から'\0'までナル文字を代入し続けたり、いろいろと試したのですが駄目でした。どうかこんな自分にご助力お願いできないでしょうか? どうかお願い致します。

  • プリンターエラーの判定

    プリンターの用紙切れやオフライン等の検出をしたいのですが、APIかなにかで出来るのでしょうか? Printerオブジェクト出力ならならON ERRORで判定は出来るみたいですが、帳票ツール(アクティブレポートOCX等)のときに判定する方法はあるのでしょうか? お解りになられる方がいらっしゃればお教え願います。 宜しくお願いいたします。

  • CreateFontで回転させて印刷出来ない

    こんにちは。maruru01です。 APIのCreateFont関数を使用して文字列を回転させ、それを印刷しようとしたのですが、うまくいきません。 どうもCreateFontの情報がPrinterオブジェクトに伝わってないようです。 オブジェクトをPrinterの替わりにForm1にするとちゃんと回転して表示されます。 どうすればうまくいくのでしょうか。 よろしくお願いします。 使用環境:Windows2000(SP2)、Visual Basic 6.0(SP5) EnterpriseEdition Private Sub Command1_Click()   Dim hdc As Long   Dim FontName As String   Dim FontHeight As Long   Dim hFont As Long   Dim hFontOld As Long   Dim tempStr As String      Const DEFAULT_CHARSET = 1      tempStr = "文字列回転"      hdc = Printer.hdc   FontName = "MS Pゴシック"   FontHeight = 9   hFont = CreateFont(-(FontHeight * 20 / Screen.TwipsPerPixelX), 0, 900, 2700, 0, False, False, False, DEFAULT_CHARSET, False, False, False, False, FontName)   hFontOld = SelectObject(hdc, hFont)      Printer.ScaleMode = vbCentimeters   Printer.CurrentX = 2   Printer.CurrentY = 2   Printer.Print tempStr      DeleteObject SelectObject(hdc, hFontOld)    End Sub

  • Windows APIでおかしな事になる。

    Windows APIでプログラミングをしています。 Windows APIでプログラミングをしています。 char*型の文字列を表示させようと、このように記述しました。 const char * y; y=f(); SelectObject(hdc , hFont); SetBkColor(hdc , RGB(255 , 255 , 255)); wsprintf( str, "名前は、%s", y ); TextOut(hdc , 300, 20, str, lstrlen(str)); すると、表示できたのはいいのですが、 タイトルバーをクリックしてウィンドウを広げたり、別のウィンドウを一番前に持ってきて、 その後、そのウィンドウを出したりすると、エラーが出て、強制終了になってしまします。 何か問題はありますか? ちなみに、strの宣言はこのようになっております。 static TCHAR str[64]; あとですが、 wsprintf( str, "名前は、%s", y ); この部分のyを&yに変えると、エラーは起こりませんが、 変な文字が表示されてしまいます。 ウィンドウを少し操作すると、その文字がまた変な文字に変わります。 何が原因でしょうか。

専門家に質問してみよう