• ベストアンサー

コンソールアプリでのクリップボードの使用について

C#のコンソールアプリでクリップボードが使用できないです VS 2008の環境でClipbordクラスを利用しています。そのため System.Windows.Forms(.dll)を設定しているのですが 実行時にオブジェクトの参照ができないようです。 具体的には、 IDataObject oData = Clipboard.GetDataObject(); を実施してもoDataはnullのままでした。 何か他に設定が必要なのでしょうか? ちなみに、フォームアプリではClipbordクラスで問題なく使用できました。

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

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

[STAThreadAttribute] static void Main(string[] args) { Clipboard.SetText("hello"); string str = Clipboard.GetText(); Console.WriteLine(str); } これで一応の動作確認は取れましたが、エラーになったりならなかったりと非常に不安定です。 フォームアプリでは正常に動いたようですが、その時は偶然動いただけという可能性はないでしょうか?

D_matinori
質問者

お礼

ありがとうございます。 STAThread属性を付けたら動作しました。 フォームアプリはあらかじめついているので そのまま動作したようです。

関連するQ&A

  • VC++2008 で クリップボードの監視を行いたい

    いつもおせわになっております。 ただいま、Visual C++ 2008 Express Edition を使いまして、クリップボード拡張アプリを作っております。 実装したい機能として・・・  A.クリップボードにデータがコピーされる度に、クリップボードのデータを取得する。  B.ただし、クリップボード上のデータは消さない。 というものがあります。 この使用を実装するために、下記のようにデータ存在の有無をタイマーな どでポーリングすれば良いと考えました。 >IDataObject ^data = System::Windows::Forms::Clipboard::GetDataObject(); >pictureShowPicture->Image->Dispose(); >if(data->GetDataPresent(DataFormats::Bitmap) == true){ しかし、この方法だと、一回でもデータがクリップボードにコピーされると、その後もずっと「データが存在する」状態となってしまい、新しいデータが来たのかどうか判断が出来ません。 クリップボード上のデータを消せば、「データが存在しない」状態となり、次にデータがコピーされたことが分かるのですが、クリップボード上のデータは消さない実装としたいのです。 このため、下記のようにすれば問題が解決できると思いました。  1.何らかの方法でクリップボードにデータがコピーされたという通知を受け取る。  2.現在のデータが直前のデータと同じか異なるかを判断する。    (ポーリングしておいて、データが異なれば新規データと判断) 上記1,2について、実現方法をご存知の方は教えていただけませんでしょうか。 ちなみに、受け取りたいデータ形式は、ビットマップ形式画像およびテキスト形式です。 お忙しいところ恐縮ですが、よろしくお願いいたします。

  • クリップボードの中身を判別

    PHPなどは理解しておりますが、VBに関してはまったく素人で何もわからないものです。 今回、クリップボードの中身を常に監視して、ある文字列が含まれていたらそのまま、それ以外の文字列の場合は空にするアプリが必要になりました。 そこでネットでいろいろ探して次のように作りました。 Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click End End Sub Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'クリップボードの文字列データを取得する Dim ClipBoardValue As IDataObject Dim ClipBoardString As String Dim okng As Boolean Do 'クリップボードのデータを取得() ClipBoardValue = Clipboard.GetDataObject ClipBoardString = ClipBoardValue.GetData(DataFormats.Text).ToString okng = ClipBoardString.Contains("反応あり") If (okng) Then 'クリップボードに文字列をコピーする Clipboard.SetDataObject("反応あり") Else Clipboard.SetDataObject("") End If Loop End Sub End Class 一つのフォームにボタンを一つ設置し、起動したら監視開始、ボタンをクリックしたら終了という形にしています。 動作させると、以下の問題があります。 ・どんな文字をコピーしてもすぐ空になってしまう ・フォームが表示されない ・起動時にクリップボードの中身が空だとエラーが表示される (オブジェクトのインスタンスにはnewを使用しろとかなんとか。。。) 正しい動作をするコードを教えていただけないでしょうか。 よろしくお願い致します。

  • LAMEのコンソールアプリ

    こんにちは、 環境はwin7で、VS2008を使用しています。 こちらの LAMEというライブラリを使って、 http://lame.sourceforge.net/ WAVからMP3に変換したいのですが、静的ライブラリを作成してwindowsとLinuxで動くコンソールアプリをつくる方法を教えていただけませんか。 まず、ライブラリを作るステップでつまづいています。 よろしくお願いします。

  • C#で画像をクリップボードへのコピーと貼り付けについて

    GraphicsオブジェクトのDrawImageメソッドを使って画像を表示させています。 この画像をクリップボードへコピーしてほかのところに貼り付けしたいのですが、クリップボードへはClipboard.SetDataObject()を使用すればよいと思っています。 しかし、どのように使ったらいいのかよくわかりません。現在のソースは以下のようになっています。 //Bitmapオブジェクトの作成(画像ファイルを読み込む) Bitmap bmap = new Bitmap(@"C:\test2.bmp"); //元の画像からの切り取り範囲の指定 RectangleF rectSrc = new RectangleF                 (pointX,pointY,WidthX,WidthY); //貼り付け先を指定範囲の指定 RectangleF rectDst = new RectangleF(0, 0, DstX,DstY); //PictureBox1のGraphicsオブジェクトの作成 Graphics g= pictureBox1.CreateGraphics(); //画像の描画 g.DrawImage(bmap, rectDst,rectSrc,GraphicsUnit.Pixel); //クリップボードへのコピー Clipboard.SetDataObject(g); よろしくおねがいいたします。

  • アクセスvbaでクリップボードにコピーの動作を実行

    アクセスvbaでクリップボードにコピーの動作を実行したいです。 エクセルなら、 Sub test() Dim buf As String Dim CB As New DataObject buf = "test" With CB .SetText buf ''変数のデータをDataObjectに格納する .PutInClipboard ''DataObjectのデータをクリップボードに格納する .GetFromClipboard ''クリップボードからDataObjectにデータを取得する Debug.Print .GetText ''DataObjectのデータを変数に取得する End With End Sub これが実行できるのですが、 どうやらアクセスだと Dim CB As New DataObject これがエラーになるようです。 Dim CB As Objectにすると .SetText buf で実行時エラー91になります。 (「オブジェクト変数またはWithブロック変数が設定されていません」) http://officetanaka.net/excel/vba/tips/tips20.htm によると、 「DataObjectオブジェクトはMSFormsのメンバです。使用するには、Microsoft Forms 2.0 Object Libraryを参照設定します。または、ブックにUserFormを挿入すると自動的に参照設定されます。」 なので、アクセスvbaの参照設定で「Microsoft Forms 2.0 Object Library」を探したのですが、 ありませんでした。 当方バージョンは2010です。 アクセスでは不可能と言うことでしょうか? ご教授よろしくお願いします。

  • VB.net 画面のハ-ドコピーでエラー

    VB.netで開発しています 実行中の画面で自分のハードコピーを印刷ボタン押下で実行するPGを作りました。 開発環境でも,インストール先でもこの半年ぐらい問題なく動いていましたが,先ごろ新規ユーザーからエラーになるとクレームがでて困っています。原因と対策を教えてください <<<エラー内容>>> Just-In-Time (JIT) デバッグを呼び出すための詳細については、 ダイアログ ボックスではなく、このメッセージの最後を参照してください。 ************** 例外テキスト ************** System.Runtime.InteropServices.ExternalException: 要求されたクリップボード操作に成功しませんでした。 場所 System.Windows.Forms.Clipboard.ThrowIfFailed(Int32 hr) 場所 System.Windows.Forms.Clipboard.GetDataObject(Int32 retryTimes, Int32 retryDelay) 場所 System.Windows.Forms.Clipboard.GetDataObject() 場所 クラス.BtnPrintDisp_Click(Object sender, EventArgs e) 場所 System.Windows.Forms.Control.OnClick(EventArgs e) 場所 System.Windows.Forms.Button.OnClick(EventArgs e) 場所 System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent) 場所 System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks) 場所 System.Windows.Forms.Control.WndProc(Message& m) 場所 System.Windows.Forms.ButtonBase.WndProc(Message& m) 場所 System.Windows.Forms.Button.WndProc(Message& m) 場所 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) 場所 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) 場所 System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) ************** 読み込まれたアセンブリ ************** <<<関連ソース部分>>> #Region "印刷ボタン" Private Sub BtnPrintDisp_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnPrintDisp.Click '印刷しますか?のMsgBox If MessageBox.Show(Com.GetIniString(ComIniNm, "QUESTIONMSG31", "MESSAGE"), Me.Text, _ MessageBoxButtons.OKCancel, MessageBoxIcon.Question) = Windows.Forms.DialogResult.OK Then ' [Alt]キー+[Print Screen]キーの送信 SendKeys.SendWait("%{PRTSC}") ' クリップボードに格納された画像の取得 Dim data As IDataObject = Clipboard.GetDataObject() If data.GetDataPresent(DataFormats.Bitmap) = True Then Dim bmp As Bitmap = CType(data.GetData(DataFormats.Bitmap), Bitmap) ' 取得した画像の印刷 gBmp = bmp PrintDoc = New System.Drawing.Printing.PrintDocument PrintDoc.Print() End If End If End Sub Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDoc.PrintPage ' 印刷ページの描画を行う gBmp.RotateFlip(RotateFlipType.Rotate270FlipNone) e.Graphics.DrawImage(gBmp, New System.Drawing.Rectangle(50, 100, 480 * 1.5, 640 * 1.5)) End Sub #End Region よろしくお願いします

  • C# Wordファイルから文章データを取得

    いつもお世話になっております。 只今、Wordの中身をリッチテキストボックスに取得しようとしています。 取得したデータを他の形式に変更するので、中身を編集というのはしない予定です。 取り込むこと自体はできるようになりまして なんとかなるかなと思っていたのですが、動作を確認していると どうも大きなファイルだと上手くいかないのです。 十数ページなら何とかいけても、数十ページだとエラーが出ます。 そこで質問です。  1:考えられる原因にはどんなものがあるでしょうか     クリップボードを利用してるので、そこが怪しいですが     ほかにありましたらお願いします。  2:解決する方法にはどんなものがあるでしょうか?  3:この方法以外にWordのデータを取得する方法はあるでしょうか?   (クリップボードを利用する以外の方法) ソースは以下のように記述しました。 --------------------------------- Type wt = Type.GetTypeFromProgID("Word.Application"); Object wApp = Activator.CreateInstance(wt); try {     Object tmpDoc = wApp.GetType().InvokeMember("Documents", BindingFlags.GetProperty, null, wApp, null);     object[] tmpFile = {             fileName,             false,             true,             false,             Type.Missing,             Type.Missing,             true,             Type.Missing,             Type.Missing,             Type.Missing,             Type.Missing,             false,             true,             Type.Missing,             true,             Type.Missing            };     Object wDoc = tmpDoc.GetType().InvokeMember("Open", BindingFlags.InvokeMethod, null, tmpDoc, tmpFile);     Object activeW = wDoc.GetType().InvokeMember("ActiveWindow", BindingFlags.GetProperty, null, wDoc, null);     Object activeWSelection = activeW.GetType().InvokeMember("Selection", BindingFlags.GetProperty, null, activeW, null);     activeWSelection.GetType().InvokeMember("WholeStory", BindingFlags.InvokeMethod, null, activeWSelection, null);     activeWSelection.GetType().InvokeMember("Copy", BindingFlags.InvokeMethod, null, activeWSelection, null);     //クリップボードの中身取得     IDataObject data = Clipboard.GetDataObject();     //リッチテキストボックス(rTextにデータを挿入)     rText.Rtf = data.GetData(DataFormats.Rtf).ToString(); } catch (Exception ex) {     MessageBox.Show(ex.ToString()); } finally {     Object apApp = wApp.GetType().InvokeMember("Application", BindingFlags.GetProperty, null, wApp, null);     apApp.GetType().InvokeMember("Quit", BindingFlags.InvokeMethod, null, apApp, new object[] { Type.Missing, Type.Missing, Type.Missing }); } --------------------------------- あちこち参考サイトを見て回っているのですが 捜し方が悪いのか、クリップボードを利用する方法以外が見つかりません。 わかる方がいましたら、よろしくお願いします。 開発環境:VisualStudio2008 実行環境:Vista Word:*.doc/*.docx

  • Xとwinのクリップボード参照

    ※ UNIXカテゴリでも質問しましたが、回答が得られないため、   マルチポストとなりますが、関連はあるのでこちらでも質問させていただきます。 ---------- windows上にて、cygwinからXFree86を立ち上げて使用しています。 windowマネージャはwindowmakerです。 windowsとXとのクリップボードの内容のやり取りを行いたいのですが 設定方法、または専用のソフトウェア?が必要なのか 教えていただけないでしょうか。 会社のX Window(XVision)では、 クリップボードに関する設定項目があったのですが…。 【環境】 OS:Windows XP Home SP1 cygwin DLL ver1.3.22-1 WindowMaker ver0.80.0

  • [VisualStudio]コンソールではリンクOKなのに、WinAPIでリンクNG

    はじめまして。 今、VisualStudio2005でC++であるDLLをリンクして使用しようとしています。(もらったライブラリでブラックボックスです。⇒仮にsample.dll) sample.libをVisualStudioのプロパティでリンク設定して sample.libに含まれるinitialize()APIを呼びます。 initialize()の内部では (1)ファイル読み込み (2)読み込んだ情報から何かしらの処理 と流れるようです。 そこでコンソールで使用した場合には、きちんと動作するのですが Winアプリで作成して同じ処理をした場合には、処理が落ちます。 Winアプリで作成した場合の感触的には、 (1)までは動いて(2)で落ちます。 内部の処理が悪いのかもしれませんが、そもそも、コンソールとWinAPIで、リンク方法など異なる部分というのがありますでしょうか? 情報が少ないかもしれませんが、詳細とまでは言わず、一般論で構いません。 詳しい方がおりましたら、ご教授いただければと思います。 イメージ的には以下のとおりです。 コンソール: int main() { initialize(); return 0; } Win32: int APIENTRY _tWinMain(...) { initialize(); return 0; }

  • VC++ オリジナルDLLを使用するとアプリを終了させる時にメモリリークする

    VisualStudio2005 C++ユーザです。 メモリリークの解決の糸口を探しています。 オリジナルDLLでクラスを作成しそれをオリジナルアプリ側で宣言だけして実行、アプリを閉じると「Detected memory leaks!」と表示されます。 アプリもDLLもデフォルト状態での使用のため、何が原因かさっぱりです。 解決の手引きお願い致します。 ●作成DLL ・DLLの種類>MFC拡張DLL ・クラスはエクスポートするように記述変更  >class AFX_EXT_CLASS CHogehoge : public CObject ・メンバ関数 InitHogehoge() として「int i=0;」のみ記述 ●作成アプリ(MDI形式) ・プロジェクト形式 MFC標準 ・共有DLLでMFCを使用に設定 ・以下のようにクラスの宣言  >例 void CTestApp::OnAppAbout()内にCHogehoge abc;を宣言 ●現象 ・アプリを終了させた時に以下が出力される Detected memory leaks! Dumping objects -> d:\実験\f_tool\f_tool.cpp(53) : {65} client block at 0x003B9028, subtype c0, 64 bytes long. a CDynLinkLibrary object at $003B9028, 64 bytes long a CDynLinkLibrary object at $003B9028, 64 bytes long {59} client block at 0x003B3298, subtype c0, 64 bytes long. a CDynLinkLibrary object at $003B3298, 64 bytes long a CDynLinkLibrary object at $003B3298, 64 bytes long Object dump complete. F_TOOL.DLL Terminating! プログラム '[192] Test.exe: ネイティブ' はコード 0 (0x0) で終了しました。 ●特記事項 エクスポートしたクラス自体は参照出来ているので基本的なミスはないつもり。 出力の「d:\実験\f_tool\f_tool.cpp(53) : {65} client block at ・・・.」はDLL側の「new CDynLinkLibrary(F_TOOLDLL);」行。 宜しくお願い致します。

専門家に質問してみよう