1

できればC#で行う必要がありますが、c ++で行う必要があります。Windowsの印刷ダイアログで、Windowsの印刷用にプリンターのリストをフィルタリングする方法を見つけてください。

私は WinAPIOverride に遭遇し、メソッドをオーバーライドしてプリンターリストを取得し、それをフィルターして返す独自の dll を作成する必要があると考えました。次に、実行中のすべてのプロセスに dll を挿入する必要があります。

すでに開発されているもの、またはおそらくこれを達成するためのより簡単な方法で誰かが私を助けることができますか? プリンターのリストを取得する唯一の方法は API メソッド呼び出しからであり、レジストリを変更することも検討しましたが、これにより印刷ダイアログ ボックスの応答が遅くなり、ユーザーにとって煩わしくなります。

4

2 に答える 2

2

DLL を (再) 作成することが最も簡単な方法だとは思いません。WMIを使用して必要な情報 (この場合はプリンター)を取得してみませんか?

次のコードは、ローカルにインストールされているすべてのプリンターを取得するためのものです: (コード サンプルはhere
から借用)

    ManagementScope objScope = new ManagementScope(ManagementPath.DefaultPath); //For the local Access
    objScope.Connect();

    SelectQuery selectQuery = new SelectQuery();
    selectQuery.QueryString = "Select * from win32_Printer";
    ManagementObjectSearcher MOS = new ManagementObjectSearcher(objScope, selectQuery);
    ManagementObjectCollection MOC = MOS.Get();
    foreach (ManagementObject mo in MOC) {
      listBox1.Items.Add(mo["Name"].ToString().ToUpper());
    }

ドメイン全体で既知のプリンターを取得するには、次を使用します。

ConnectionOptions objConnection = new ConnectionOptions();
objConnection.Username = "USERNAME";
objConnection.Password = "PASSWORD";
objConnection.Authority = "ntlmdomain:DDI"; //Where DDI is the name of my domain
// Make sure the user you specified have enough permission to access the resource. 

ManagementScope objScope = new ManagementScope(@"\\10.0.0.4\root\cimv2",objConnection); //For the local Access
objScope.Connect();

SelectQuery selectQuery = new SelectQuery();
selectQuery.QueryString = "Select * from win32_Printer";
ManagementObjectSearcher MOS = new ManagementObjectSearcher(objScope, selectQuery);
ManagementObjectCollection MOC = MOS.Get();
foreach (ManagementObject mo in MOC) {
  listBox1.Items.Add(mo["Name"].ToString().ToUpper());
}

もちろん、条件を指定しなかったため、リストは希望どおりに「フィルター処理」されていません。でも、ここから先は自分でなんとかできると思います。

于 2009-01-12T20:13:54.753 に答える
0

興味深いコードをありがとう。

アイデアは、ユーザーに干渉することなく、フィルター処理されたプリンターリストを可能な限りグローバルにシステムに適用することです。これは、残念ながら、フィルタリングされたリストを標準のウィンドウの印刷ダイアログに適用する必要があることを意味します...

したがって、WMIコードは、ちょっとクールではありますが、適切ではありません。独自の印刷ダイアログを作成している場合は、非常に便利です;)

于 2009-02-10T23:41:50.467 に答える