DOBON.NETプログラミング道掲示板

■ 「新規作成」から投稿できます。
■ マルチポストされた投稿を見つけたときは、その投稿に返信することによりご報告ください。その際は匿名で投稿し、マルチポストされている場所を併記してください。
■ スパム対策のため、メールアドレスの先頭に"_"という文字が付加されています。
RSS 2.0 RSS 2.0 | RSS 0.91 | 携帯電話用 | 自分専用のアイコンを使用するには | 掲示板への要望 | 管理人に連絡 | お気楽掲示板
■ 24時間以内に作成されたスレッドは New で表示されます。
■ 24時間以内に更新されたスレッドは UpDate で表示されます。

記事リスト ( )内の数字はレス数
Nomalユーザーフォームに埋め込んだAutoCADの変化を捉える(0) | Nomalシステムドライブ以外へのページング設定が反映されない(5) | Nomalブラウザでコピーした透過PNGを貼り付けたい(4) | Nomalforeachでループ回数を取得(2) | Nomalbitmapが保存できない(2) | Nomal特定ピクセルで画像を読み込みたい(2) | NomalDataGridViewでAlt+Enterで改行したい(2) | Nomal全角シフト中にアクセスキーが効かない(5) | NomalDataAdapter.Updateで構文エラー(6) | Nomal抽象クラスで実装したクラスの情報を知る(3) | NomalProcessクラスからbatファイル実行後、KILLできない(2) | Nomal画面遷移(モーダルとモードレス)(2) | Nomal兆億万表記の文字列を数値に変換できる?(3) | NomalGetDirectoriesでルートを指定するとエラーになる(3) | NomalLinqにおける明示的型指定の方法(3) | Nomal2つのradの数値から1つの角度を求めるコードを改善できますか?(C++)(2) | Nomalコンソールアプリで、WebView2の利用(2) | NomalEntity Frameworkは、使えるか?(2) | Nomalデータベースからのテーブル名一覧の効率的な取得方法(3) | NomalC#のlong型でオーバーフローになる(2) | Nomal正規表現のパターン表記方法(2) | NomalWebView2によるスクレ―ピング(4) | Nomalこういた物を作れますか?(2) | Nomalツールボックスにtableadapterが表示されない(1) | NomalC# Chart X軸上のグラフ表示(3) | NomalVB.NETでBluetoothデバイスの電池残量を取得する方法(3) | Nomalクリスタルレポート 明細部のサブレポート(0) | Nomal重なったPictureBox同士を透過する方法(7) | NomalWindowsフォームデザイナについて(3) | NomalVB.NETからcmdでpingを実行した時の結果(5) | Nomalvb.netでExcelファイル操作(7) | Nomalvb.netでのExcelファイルそうさ(2) | Nomalキーボード+バーコードでキーボード入力を無効にしたい(6) | Nomalファイルとして配置したマニフェストを優先したい(2) | NomalTabPageの背景色(5) | NomalVB2022でクリスタルレポートが開けない(2) | NomalC#でJpeg圧縮のTiffファイルを作成したい(4) | Nomalエクセルのみ監視ができない(2) | NomalDataGridViewのVirtualModeを有効した場合の実装方法(4) | NomalExcelの数値 -> 日付みたいな関数?(2) | NomalDrawstringでの透過文字作成(3) | Nomaljumbo icon(256x256)が存在するか知る方法(6) | NomalSpinWait()を使う理由(2) | Nomalantecedentってなんですか?(2) | Nomalワンタイムパスワードのサイトに自動ログインしてアクセストークンを得る(3) | Nomalstyle.displayだと効率悪いから違うやり方をしたいです。(5) | Nomalテーブルを順番通りに直すプログラムを外部で読み込めるようにしたいです。(4) | NomalJSONの複雑な入れ子内部の値を取りたい。(3) | Nomalグリッド表示レコードをJSONに変換(5) | Nomalシステム時計の設定(3) | NomalSeleniumで開いているページのTableを編集したい(5) | Nomalソケット通信入門 ひらがな(4) | NomalVisual Basicでエラーが出る(3) | Nomalインストーラにて、ローミングフォルダにファイルを配置したい(0) | NomalRGB値の所得(2) | NomalVB.net からAccessDBへの接続(2) | Nomal時間変数(文字列)の扱い(4) | Nomal画像のスクロール(6) | Nomalタイマーの一括処理(6) | NomalTreeViewとDataGridViewのスクロールを同期(シンクロ)させたい(4) | NomalTreeViewの現在位置とDataGridViewの現在位置を合わせたい(7) | Nomalフォームのリサイズ時にDataGridViewが再描画されない(4) | NomalPDFをフォーム上で表示させる方法につきまして(4) | NomalPictureBoxの画像を連続保存(11) | NomalテキストボックスのValidatingイベントよりも先に発生するボタン発生イベントは何でしょう?(2) | Nomal継承元フォームで各フォームのボタン動作を検知したい(3) | NomalWindowsエクスプローラからのドラッグ&ドロップ(2) | Nomalラジオボタンの一括設定(7) | Nomalクリックイベントでexeを作成できるか(2) | Nomal作成した白黒画像をWordに貼り付けてから「図として保存」(8) | Nomalアセンブリ情報が載らない(1) | NomalRichTextBoxのテキストをpictureBOXへ(12) | Nomalc#で日付型の定義の仕方で質問があります。(2) | Nomal先頭に空白(スペース)があるファイルを読み込んでRichTextBoxへ書き出すとスペースが削除える(6) | NomalExcel Com オブジェクトの増殖(13) | Nomal二次元マップから値の取得(1) | NomalアプリでHDMIへ出す解像度を変えたい(4) | NomalDataGridViewのドロップダウンリストの表示と選択後の値を分けたい(1) | Nomal列車の時間ごとの位置情報を表示したいです。(2) | Nomal画像の中心を基点に回転(4) | NomalDataGridViewの行ヘッダーに行番号を表示した時のエラー(4) | NomalタッチキーボードでIMEを自動で切替えたい(6) | NomalVSTOによるエクセルアドインのインストーラーでのアップデート(1) | NomalMP4動画を再生する方法について(5) | NomalVB.NetでVB6.0と同じFontを指定しても同様に印刷されない(9) | NomalLabelで文字単位の背景色(7) | NomalLableのカラー色を文字変数から変更したい(5) | NomalUrlにアクセスするとダウンロードされるファイルを捕まえる(2) | Nomalタブレット等でスワイプによるスクロールを実装(2) | NomalTEXTBOXのプロパティを文字列に(7) | NomalPDFをフォーム上で表示させる方法につきまして(6) | NomalChart X軸上の描画を切り替えたい(0) | NomalRichTextBoxへのドラッグ&ドロップしたExcelファイルの扱い(3) | Nomal特定のPCだけ発生する「パディングは無効なので削除できません」のエラーの原因(6) | NomalASP.NET WebApi内でXmlReader.Create(url)がタイムアウトする(4) | NomalDatagridViewでファンクションキーを止めたい(5) | Nomal表示動作が重くなる(3) | Nomalbitmapを複数スレッドで処理したい(2) | NomalLoadOptionのパラメータの意味(3) | NomalDataGridViewの特定セルにボタンを配置する方法(5) |



■記事リスト / ▼下のスレッド
■35623 / 親記事)  ユーザーフォームに埋め込んだAutoCADの変化を捉える
□投稿者/ SASAYAN 一般人(1回)-(2024/07/21(Sun) 17:46:55)
  • アイコン環境/言語:[VB.NET FrameWork4.8] 
    分類:[.NET] 

    VB.NETでAutoCADに連携する方法で困っています。
    起動中のAutoCADに複数のドキュメント(ファイル)が開いているとします。
    ファイルタブが複数あって、これをクリックして切り替えるたびに発生する
    イベントを捉えてリストボックスにレイヤーのリストを表示させたいです。
    
    ファイルタブの切り替えを捉えるのにどの様に記述すればよいか困っています。
    コードの40行目あたりの
     Dim docManager As DocumentCollection = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager
     AddHandler docManager.DocumentActivated, AddressOf Me.DocumentActivated
    ここで引っ掛かってしまいます。
    
    現在のコード
    Imports System.Runtime.InteropServices
    Imports Autodesk.AutoCAD.Interop
    Imports Autodesk.AutoCAD.Interop.Common
    Imports Autodesk.AutoCAD.Runtime
    Imports Autodesk.AutoCAD.ApplicationServices
    Imports Autodesk.AutoCAD.DatabaseServices
    Imports Autodesk.AutoCAD.Geometry
    Imports Microsoft.VisualBasic
    
    Public Class Form1
        Private acadApp As AcadApplication
    
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            Try
                ' 新しいAutoCADアプリケーションを作成
                acadApp = New AcadApplication()
                acadApp.Visible = True
            Catch ex As System.Runtime.InteropServices.COMException
                MessageBox.Show("AutoCADのインスタンスを作成できませんでした: " & ex.Message)
                Return
            Catch ex As Exception
                MessageBox.Show("予期しないエラーが発生しました: " & ex.Message)
                Return
            End Try
    
            If acadApp Is Nothing Then
                MessageBox.Show("AutoCADアプリケーションを初期化できませんでした。")
                Return
            End If
    
            ' AutoCADのウィンドウをForm1の指定位置に埋め込む
            Dim acadHandle As IntPtr = New IntPtr(acadApp.HWND)
            SetParent(acadHandle, Me.Handle)
    
            ' 初期位置とサイズを設定
            ResizeAutoCADWindow()
    
            ' Form1のリサイズイベントにハンドラを追加
            AddHandler Me.Resize, AddressOf Form1_Resize
    
            ' 初回のレイヤーリストを取得して表示
            PopulateLayerList()
    
            ' ドキュメントアクティベートイベントの追加
            Dim docManager As DocumentCollection = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager
            AddHandler docManager.DocumentActivated, AddressOf Me.DocumentActivated
        End Sub
    
        Private Sub Form1_Resize(sender As Object, e As EventArgs)
            ' AutoCADウィンドウをForm1の新しいサイズに合わせてリサイズ
            ResizeAutoCADWindow()
        End Sub
    
        Private Sub ResizeAutoCADWindow()
            Dim acadHandle As IntPtr = New IntPtr(acadApp.HWND)
    
            ' panelControlsの右側にAutoCADウィンドウを表示する
            Dim leftPosition As Integer = panelControls.Width
            Dim topPosition As Integer = 0
            Dim width As Integer = Me.ClientSize.Width - panelControls.Width
            Dim height As Integer = Me.ClientSize.Height
    
            MoveWindow(acadHandle, leftPosition, topPosition, width, height, True)
        End Sub
    
        Private Sub PopulateLayerList()
            Try
                ' Layer_LBをクリア
                If Layer_LB Is Nothing Then
                    MessageBox.Show("Layer_LBが初期化されていません。")
                    Return
                End If
                Layer_LB.Items.Clear()
    
                ' AutoCADの現在のドキュメントを取得
                Dim activeDoc As AcadDocument = acadApp.ActiveDocument
    
                ' レイヤーを取得してリストボックスに追加
                For Each layer As AcadLayer In activeDoc.Layers
                    Layer_LB.Items.Add(layer.Name)
                Next
            Catch ex As Exception
                MessageBox.Show("レイヤーリストの取得中にエラーが発生しました: " & ex.Message)
            End Try
        End Sub
    
        ' ドキュメントがアクティブになったときにレイヤーリストを更新する
        Private Sub DocumentActivated(sender As Object, e As DocumentCollectionEventArgs)
            PopulateLayerList()
        End Sub
    
        ' WinAPI関数の宣言
        <System.Runtime.InteropServices.DllImport("user32.dll")>
        Private Shared Function SetParent(hWndChild As IntPtr, hWndNewParent As IntPtr) As IntPtr
        End Function
    
        <System.Runtime.InteropServices.DllImport("user32.dll")>
        Private Shared Function MoveWindow(hWnd As IntPtr, x As Integer, y As Integer, nWidth As Integer, nHeight As Integer, bRepaint As Boolean) As Boolean
        End Function
    
        Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
            ' AutoCADアプリケーションをクリーンアップ
            If acadApp IsNot Nothing Then
                Try
                    acadApp.Quit()
                Catch ex As Exception
                    ' 例外が発生しても続行
                Finally
                    ' COMオブジェクトの解放
                    Marshal.ReleaseComObject(acadApp)
                    acadApp = Nothing
                End Try
            End If
    
            ' ドキュメントアクティベートイベントの削除
            Dim docManager As DocumentCollection = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager
            RemoveHandler docManager.DocumentActivated, AddressOf Me.DocumentActivated
        End Sub
    End Class
    
    ここまでフォーム上にAutoCADを埋め込み表示させるまでできましたが
    肝心のAutoCADの変化を捉える部分でうまくいきません。
    よろしくお願いします。

違反を報告
引用返信



■記事リスト / ▼下のスレッド / ▲上のスレッド
■35616 / 親記事)  システムドライブ以外へのページング設定が反映されない
□投稿者/ ぺんたごん 一般人(8回)-(2024/06/10(Mon) 17:07:25)
  • アイコン環境/言語:[Windows 11 Pro 21H2] 
    分類:[その他] 

    ごぶさたしております。
    今回はプログラミングに関係ない話になってしまいますが
    情報が見つからず藁をも掴む思いで質問させていただきます。
    
    ■環境
    Windows 11 Pro 21H2
    C   … NVMe SSD 256 GB
    D   … SATA HDD 1000 GB
    Mem … 16 GB
    
    ■実施した内容と発生した現象
    Visual Studio をはじめとした、一部ファイルが C に強制的に入るソフトウェアを
    多数インストールしているため C の空き領域が足りなくなり、
    ページングを D に移行しようとしました。
    
    仮想メモリ設定で
      C … ページングなし
      D … 8192 -8192 MB
    にしましたが、再起動後に構成エラーとなり再設定を促されました。
    そこで次に
      C … 1024 - 1024 MB
      D … 8192 - 8192 MB
    としたらエラーは起きなくなったのですが、パフォーマンスオプション画面の
    仮想メモリ欄を見ると「すべてのドライブの総ページングファイルサイズ」が
    1024 MB になっており、D から pagefile.sys が消えていました。
    (しかし仮想メモリ設定画面の D には 8192 - 8192 と設定されたまま)
    
    何度設定しても、たまに D の pagefile.sys が残ったまま消えないことが
    ありつつも OS の認識としては C のページングのみとなっています。
    
    USBメモリにページング設定した場合は認識タイミングによってそういったことが起こるようですが
    SATA接続のHDDでそれが起きるのは何故でしょうか
    そして解決する手段は存在するのでしょうか…
    
    以上よろしくお願いします

違反を報告
引用返信

▽[全レス5件(ResNo.1-5 表示)]
■35617 / ResNo.1)  Re[1]: システムドライブ以外へのページング設定が反映されない
□投稿者/ 魔界の仮面弁士 大御所(1575回)-(2024/06/11(Tue) 11:13:40)
  • アイコンNo35616に返信(ぺんたごんさんの記事)
    > Visual Studio をはじめとした、一部ファイルが C に強制的に入るソフトウェアを
    > 多数インストールしているため C の空き領域が足りなくなり、
    > ページングを D に移行しようとしました。

    自分の場合は、C: ドライブ配下のフォルダーの一部
    (C:\Program Files\dotnet\ など)を、
    別ドライブ上への「シンボリックリンク」とすることで回避しています。

    これにより、容量の大きいアプリケーション群を、
    取り扱い上のパス表記は C:\ 配下のままでアクセスさせつつ、
    実ファイルは、 D: や E: に配置させる構成にすることができます。
    https://www.vb-user.net/junk/replySamples/2024.06.11.09.46/SymLinkDir.png
    https://atmarkit.itmedia.co.jp/ait/articles/1306/07/news111.html

    別案として、パーティション丸ごと割り当てる方法もありますが、
    自分の場合はシンボリックリンクを使うことの方が多いです。
    https://atmarkit.itmedia.co.jp/ait/articles/0002/05/news001.html



    > 再起動後に構成エラーとなり再設定を促されました。
    エラーメッセージの内容を教えていただけますか。


    > 「すべてのドライブの総ページングファイルサイズ」が
    > 1024 MB になっており、D から pagefile.sys が消えていました。
    シャットダウン時に仮想メモリのページファイルをクリアする設定にしているのでしょうか?
    https://www.softwareok.com/?seite=faq-Windows-8&faq=118#Image1


    > (しかし仮想メモリ設定画面の D には 8192 - 8192 と設定されたまま)
    類似の事例は幾つか報告されていますが…今のところ、
    「システムの復元」を使って、正常時時点の復元ポイントに戻すことで復帰したという事例があったぐらいです。
    https://www.techguy.org/threads/cannot-allocate-virtual-memory-allocated-always-0mb.253368/

    設定値が不自然な場合、Windows はそれを無視して独自の動的設定を使用する場合があるという
    記事がありましたが、今回の事象がそれにあたるのかは分かりません。
    https://www.computerhope.com/forum/index.php?topic=46686.0

    古い記事も参考にすると
    KB315270 (2007/12/01)
     ⇒ ボリュームに対する適切な NTFS アクセス許可が System アカウントと Administrators アカウントになかった
     ⇒⇒ NTFS ボリュームに対するフル コントロール権限を System アカウントと Administrators アカウントに与える
    KB316528 (2006/10/19)
     ⇒ 特定のチップセットで発生する問題
     ⇒⇒ BIOS/UEFI の更新を検討
    といったものもありましたが…。

    今のところ、それ以外の対処法は見つかっていません。
    https://www.sevenforums.com/performance-maintenance/297783-windows-doesnt-use-page-file-different-drive.html
    https://answers.microsoft.com/en-us/windows/forum/all/total-paging-file-for-all-drives-doesnt-include/d8676448-b61b-47c9-91dc-0ef518a595d7
    https://www.elevenforum.com/t/cant-change-pagefile-to-the-way-it-was-before-even-after-following-instructions-on-how-to-do-so.6208/
違反を報告
引用返信
■35618 / ResNo.2)  Re[2]: システムドライブ以外へのページング設定が反映されない
□投稿者/ ぺんたごん 一般人(9回)-(2024/06/12(Wed) 08:20:49)
  • アイコン
    返信ありがとうございます
    
    >>再起動後に構成エラーとなり再設定を促されました。
    > エラーメッセージの内容を教えていただけますか。
    Cのページングを無しにすると
    「コンピューターの開始時にページングファイル構成に問題が発生したため、一時ページングファイルが作成されました。
    前ディスクドライブの総ページングファイルサイズが指定したサイズよりも大きくなっている可能性があります。」
    となります。
    そして実際、10GBほどのページングファイルがCに作成されました。
    
    > シャットダウン時に仮想メモリのページファイルをクリアする設定にしているのでしょうか?
    > https://www.softwareok.com/?seite=faq-Windows-8&faq=118#Image1
    [ローカル ポリシー]、[セキュリティ オプション]、[シャットダウン: 仮想メモリのページファイルをクリアする]
    を確認しましたが「無効」となっていました。
    
    
    正直、原因が全くわからないので、ひとまず
    仕方なくCに8192MB設定してDは無しにしています…
    

違反を報告
引用返信
■35619 / ResNo.3)  Re[3]: システムドライブ以外へのページング設定が反映されない
□投稿者/ KOZ 一般人(37回)-(2024/06/12(Wed) 22:59:06)
  • アイコンNVMe と HDD の速度差で現象起きてるんですかね?

    コマンドで設定してみます?

    管理者権限でコマンドプロンプトを立ち上げます。

    > C … 1024 - 1024 MB
    > D … 8192 - 8192 MB

    にするのであれば

    REM ページファイルの自動管理を無効にする
    wmic computersystem where name="%computername%" set AutomaticManagedPagefile=False
    REM ページファイル削除
    wmic pagefileset where name="C:\\pagefile.sys" delete
    wmic pagefileset where name="D:\\pagefile.sys" delete
    REM Cドライブを設定
    wmic pagefileset create name="C:\\pagefile.sys"
    wmic pagefileset where name="C:\\pagefile.sys" set InitialSize=1024,MaximumSize=1024
    REM Dドライブを設定
    wmic pagefileset create name="D:\\pagefile.sys"
    wmic pagefileset where name="D:\\pagefile.sys" set InitialSize=8192,MaximumSize=8192
    REM 再起動
    shutdown /r /t 0

違反を報告
引用返信
■35620 / ResNo.4)  Re[4]: システムドライブ以外へのページング設定が反映されない
□投稿者/ KOZ 一般人(38回)-(2024/06/12(Wed) 23:09:50)
  • アイコンちなみに、

    wmic pagefile list /format:list

    と打つと、現在の設定値が表示されます。
    表示された値を ChatGPT などの AI に聞いてみると、何かわかるかもしれません。

    AllocatedBaseSize=36864
    CurrentUsage=0
    Description=C:\pagefile.sys
    InstallDate=20240427203020.906456+540
    Name=C:\pagefile.sys
    PeakUsage=0
    Status=
    TempPageFile=FALSE
    と出てきたのですが、"それぞれのパラメタについて説明してください"と聞くと

    ・ページファイルの初期サイズは36,864MB(36GB)。
    ・現在使用中のページファイルのサイズは0MB。
    ・ページファイルのパスはC:\pagefile.sys。
    ・ページファイルが作成されたのは2024年4月27日20時30分20秒。
    ・ページファイルのピーク使用量は0MB。
    ・ページファイルの状態に関する特記事項はなし。
    ・ページファイルは一時的なものではない。

    と帰ってきました。
違反を報告
引用返信
■35621 / ResNo.5)  Re[5]: システムドライブ以外へのページング設定が反映されない
□投稿者/ ぺんたごん 一般人(10回)-(2024/06/13(Thu) 08:46:43)
  • アイコンありがとうございます。
    試してみましたが、set InitialSize…の行で
    「利用できるインスタンスがありません。」エラーになり、
    再起動後は C も D も「システム管理サイズ」になりました。
    そして「システム管理サイズ」になっても D には pagefile.sys が作成されないので
    どうあがいても D にページングできないようです…

    もう諦めて魔界の仮面弁士さんに頂いた
    シンボリックリンクで C を空ける手法を取るしかなさそうですね

違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-5]



■記事リスト / ▼下のスレッド / ▲上のスレッド
■35611 / 親記事)  ブラウザでコピーした透過PNGを貼り付けたい
□投稿者/ よっし〜 一般人(1回)-(2024/06/07(Fri) 12:18:00)
  • アイコン環境/言語:[VB.NET2013 Win7] 
    分類:[.NET] 

    お疲れ様です。
    現在ブラウザ上に表示されている画像をフォームのPictureBoxに表示するソフトを作成しております。
    ブラウザに表示されている画像で「画像をコピー」しクリップボード経由で「Dim Img As Image = My.Computer.Clipboard.GetImage()」
    すると背景が真っ黒になります。
    画像が透過PNGの為だと思っておりますが、この画像の背景を白にしてPictureBoxに表示する方法はありませんでしょうか?

    If My.Computer.Clipboard.ContainsImage() Then
    Dim Img As Image = My.Computer.Clipboard.GetImage()
    PictureBox1.Image = Img
    End If

    ちなみに透過PNGブラウザで一旦保存し、そのPNGファイルを加工する方法も行いましたが、クリップボードに送られた段階
    で背景が黒く塗られている様で、うまく行きません。

    Using pngImage As Image = Image.FromFile(pngFilePath)
    Using bmp As New Bitmap(pngImage.Width, pngImage.Height)
    Using g As Graphics = Graphics.FromImage(bmp)
    g.Clear(Color.White)
    g.DrawImage(pngImage, 0, 0, pngImage.Width, pngImage.Height)
    End Using
    bmp.Save(OutputFile, ImageFormat.Png)
    End Using
    End Using

    以上、宜しくお願いいたします。
違反を報告
引用返信

▽[全レス4件(ResNo.1-4 表示)]
■35612 / ResNo.1)  Re[1]: ブラウザでコピーした透過PNGを貼り付けたい
□投稿者/ 魔界の仮面弁士 大御所(1573回)-(2024/06/07(Fri) 14:13:32)
  • アイコンNo35611に返信(よっし〜さんの記事)
    >「Dim Img As Image = My.Computer.Clipboard.GetImage()」
    > すると背景が真っ黒になります。

    CF_BITMAP が取得されたためでしょう。
    取得フォーマットの問題ですね。


    たとえば、下記を Edge からコピーしてみた場合、
    クリップボードには 6 種類のデータが保持されました。
    https://ascii.jp/img/2021/04/11/3186022/l/33f2a9acb9788a6d.png

    CF_PNG ("PNG") ⇒ 透過のPNG画像(460x460)
    CF_DIBV5 (17) ⇒ 黒背景のデバイス非依存ビットマップ(460x460)
    CF_HTML ("HTML Format") ⇒ img タグ入りのHTML(終端nullあり、CRLF改行)
    ("Chromium internal source URL") ⇒ URL文字列(終端nullあり、改行なし)
    CF_BITMAP (2) ⇒ ビットマップハンドル (HBITMAP)
    CF_DIB (8) ⇒ 黒背景のデバイス非依存ビットマップ(460x460)

    ということで修正案。

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
      Dim c = Clipboard.GetDataObject()
      Dim img As Image = Nothing
      If c.GetDataPresent("PNG", False) Then
        Dim o = TryCast(c.GetData("PNG"), System.IO.MemoryStream)
        If o IsNot Nothing Then
          img = Image.FromStream(o)
        End If
      ElseIf c.GetDataPresent(GetType(Image)) Then
        img = DirectCast(c.GetData(GetType(Image)), Image)
      End If
      PictureBox1.Image = img
    End Sub
違反を報告
引用返信
■35613 / ResNo.2)  Re[2]: ブラウザでコピーした透過PNGを貼り付けたい
□投稿者/ よっし〜 一般人(3回)-(2024/06/07(Fri) 15:14:46)
  • アイコン魔界の仮面弁士さん、早速のご教示、有り難うございます。

    一応お教え頂いたソースを新しいプロジェクトにして作成し、
    https://ascii.jp/img/2021/04/11/3186022/l/33f2a9acb9788a6d.png
    をブラウザでコピーし、Buttonを押してみたのですが、
    PictureBox1.Image = img
    で「img」はNohingでした。(画像が取れていない様です)

    で、少し気になったのですが、ブラウザによって動作(内容)は変わるものでしょうか?
    例として同じ「33f2a9acb9788a6d.png」をブラウザ上でコピーしワードパッドに貼って見ました。
    FireFox:背景は白(透過)でペーストされました
    Crome:背景は黒でペーストされました

    お教え頂いたソースでは・・・
    Crome:画像が表示されました
    FireFox:PictureBox1.Image = imgのimgがnothingになりました。

    同じコピーでも形式が変わるって事なのでしょうか??

    以上、宜しくお願いいたします。


違反を報告
引用返信
■35614 / ResNo.3)  Re[3]: ブラウザでコピーした透過PNGを貼り付けたい
□投稿者/ 魔界の仮面弁士 大御所(1574回)-(2024/06/07(Fri) 16:11:01)
  • アイコンNo35613に返信(よっし〜さんの記事)
    > 同じコピーでも形式が変わるって事なのでしょうか??
    クリップボードにデータを送信する処理というのは、
    それぞれのアプリケーションの実装依存になっていますので、
    ブラウザーがによって異なる形式になることは十分にありえます。


    > 例として同じ「33f2a9acb9788a6d.png」をブラウザ上でコピーしワードパッドに貼って見ました。
    これも同様。
    クリップボードには、複数のデータ形式が同時に保持されることが多いですが
    その場合、どの形式を採用するかは、添付先のアプリケーション依存です。
    Excel でも、"形式を選択して貼り付け" というモードがありますよね?

    複数のフォーマットをサポートしているアプリの場合、
    (1) 列挙されたフォーマットのうち、最初の形式を採用
    (2) サポートしている形式に優先度をつけ、優先順位の高いフォーマットを優先
    などの違いが生じることがあります。

    たとえば先の私のサンプルは (2) の実装であり、
    "PNG" 優先、無ければ Image を採用…という処理になっているわけです。


    > https://ascii.jp/img/2021/04/11/3186022/l/33f2a9acb9788a6d.png
    > FireFox:PictureBox1.Image = imgのimgがnothingになりました。
    個人的には、Firefox は苦手なんですよね…。
    Child-Tree 系の掲示板に繋ぐと、全角投稿者名などの cookie が腐ることがあったりするので。
    サイト側の問題だといえばそれまでなんですが。


    それはさておき、相手が Firefox や Internet Explorer ならば
     Dim s = Clipboard.GetFileDropList()
     If s.Count > 0 Then
      PictureBox1.LoadAsync(s(0))
      Return
     End If
    で行けるんじゃないですかね?

    試しに FireFox を再インストールして確認してみたところ、
    Internet Explorer および Firefox の場合は、
    下記の 14 種類の形式がクリップボードに含まれていました。


    【Internet Explorer 11 (Win10 22H2) で画像をコピーした場合】
     #01 "DataObject"
     #02 CFSTR_UNTRUSTEDDRAGDROP (50519)
     #03 "msSourceUrl"
     #04 CF_HDROP (15)
     #05 CFSTR_INETURLW (49483)
     #06 CF_DIB ★黒背景画像
     #07 "HTML Format"
     #08 CF_UNICODETEXT (13)
     #09 CF_TEXT (1)
     #10 "Ole Private Data"
     #11 CF_LOCALE (16)
     #12 CF_OEMTEXT (7)
     #13 CF_BITMAP (2) ★黒背景画像
     #14 CF_DIBV5 (17) ★黒背景画像


    【Firefox (ver 126.0.1 64bit) で画像をコピーした場合】
     #01 "DataObject"
     #02 "text/html"
     #03 "HTML Format"
     #04 "text/_moz_htmlinfo"
     #05 "text/_moz_htmlcontext"
     #06 "application/x-moz-file-promise-url"
     #07 "application/x-moz-file-promise-dest-filename"
     #08 CF_HDROP (15)
     #09 CFSTR_PREFERREDDROPEFFECT (49472)
     #10 "application/x-moz-nativeimage" ※取得できない
     #11 CF_DIBV5 (17) ★黒背景画像
     #12 CF_DIB (8) ★黒背景画像
     #13 "Ole Private Data"
     #14 CF_BITMAP (2) ★黒背景画像


    ※"application/x-moz-nativeimage" の場合に HGLOBAL が NULL となるのはバグらしい?
    https://bugzilla.mozilla.org/show_bug.cgi?id=255686
違反を報告
引用返信
■35615 / ResNo.4)  Re[4]: ブラウザでコピーした透過PNGを貼り付けたい
□投稿者/ よっし〜 一般人(4回)-(2024/06/07(Fri) 17:36:16)
  • アイコン魔界の仮面弁士さん、早速のご教示有り難うございます。

    > それはさておき、相手が Firefox や Internet Explorer ならば
    >  Dim s = Clipboard.GetFileDropList()
    >  If s.Count > 0 Then
    >   PictureBox1.LoadAsync(s(0))
    >   Return
    >  End If
    > で行けるんじゃないですかね?

    本当ですね。普通に表示出来ました。
    ただFireFoxはいけましたが、CromeやEdgeも対象としたいので、先にご教示頂きました
     Dim c = Clipboard.GetDataObject()
      Dim img As Image = Nothing
      If c.GetDataPresent("PNG", False) Then
        Dim o = TryCast(c.GetData("PNG"), System.IO.MemoryStream)
        If o IsNot Nothing Then
          img = Image.FromStream(o)
        End If
      ElseIf c.GetDataPresent(GetType(Image)) Then
        img = DirectCast(c.GetData(GetType(Image)), Image)
      End If
      PictureBox1.Image = img
    との合わせ技で解決出来そうです。
    長い間悩んでおりました。どうも有り難うございました。


解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-4]



■記事リスト / ▼下のスレッド / ▲上のスレッド
■35608 / 親記事)  foreachでループ回数を取得
□投稿者/ Wan 付き人(97回)-(2024/06/06(Thu) 15:16:44)
  • アイコン環境/言語:[.Net6 C# Windows] 
    分類:[.NET] 

    AngleSharpを使っています。

    foreachでループ回数を取得するためにLinqのSelect句を使用してIndexを使用しています。

    foreach ( var LopItem in doc.QuerySelectorAll(".news_list>li").Select((Value, Index) => new { Value, Index }))
    {

     ここでLopItemをメソッドに渡したい。その時に、メソッド側で引数となるLopItemの型を指定したい。



    上のコードでは、ループ変数の型をvarを使って推論させていますが、
    具体的に型を指定する場合どのような型となるのでしょうか?

    ローカル変数で見るとvar LopItmの方は
    +LopItem{ Value = {AngleSharp.Html.Dom.HtmlListItemElement}, Index = 0 } <Anonymous Type>
    と表示されます。

    型として<Anonymous Type>「匿名型?」と

    すると、LopItemの型はどのように指定すれば良いのでしょうか?
    詳しい方宜しくお願い致します。
違反を報告
引用返信

▽[全レス2件(ResNo.1-2 表示)]
■35609 / ResNo.1)  Re[1]: foreachでループ回数を取得
□投稿者/ 魔界の仮面弁士 大御所(1572回)-(2024/06/06(Thu) 17:03:14)
  • アイコン2024/06/06(Thu) 17:07:36 編集(投稿者)

    No35608に返信(Wanさんの記事)
    > 環境/言語:[.Net6 C# Windows] 
    .NET 6 は半年後にサポート期限が切れるので、
    .NET 8 への移行準備を進めておいた方が良いかと。


    > メソッド側で引数となるLopItemの型を指定したい。
    案1) メソッド引数を dynamic にして、匿名型をそのまま渡す
     foreach (var LopItem in doc.QuerySelectorAll(".news_list>li").Select((Value, Index) => new { Value, Index }))
     {
      Foo1(LopItem)
     }
     void Foo1(dynamic lopItem)
     {
     }


    案2) 匿名型の代わりに、record class や record struct などを使う
     foreach (var LopItem in doc.QuerySelectorAll(".news_list>li").Select((Value, Index) => new Example( Value, Index )))
     {
      Foo2(LopItem);
     }
     void Foo2(Example lopItem)
     {
     }
     record struct Example(AngleSharp.Dom.IElement Value, int Index);


    案3) 匿名型を止めて、タプルで渡す
     foreach (var LopItem in doc.QuerySelectorAll(".news_list>li").Select((Value, Index) => ( Value, Index )))
     {
      Foo3(LopItem);
     }
     void Foo3((AngleSharp.Dom.IElement Value, int Index) lopItem)
     {
     }


    案4) Value と Index を別引数にして渡す
     foreach (var (value, index) in doc.QuerySelectorAll(".news_list>li").Select((Value, Index) => (Value, Index)))
     {
      Foo4(value, index);
     }
     void Foo4(AngleSharp.Dom.IElement value, int index)
     {
     }
違反を報告
引用返信
■35610 / ResNo.2)  Re[2]: foreachでループ回数を取得
□投稿者/ Wan 付き人(98回)-(2024/06/07(Fri) 08:20:56)
  • アイコン魔界の仮面弁士様
    いつもありがとうございます

    dynamic型ってこのような使い方ができるのですね?
    今まで、他言語との連系などやることは無いと思い全く勉強していませんでした。
    この機会にかじってみようと思います。

    2案のrecord class や record struct についても全く想像も出来ませんでした。

    教えて頂いたことを、熟読してスキルアップにつなげたいと思います。
    ありがとうございました。
解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-2]



■記事リスト / ▲上のスレッド
■35604 / 親記事)  bitmapが保存できない
□投稿者/ K-1 一般人(1回)-(2024/05/03(Fri) 22:12:10)
  • アイコン環境/言語:[C#] 
    分類:[.NET] 

    画像ファイルに対し加工を行うコードを作っています。
    画像ファイルを読み込み、バイト配列に変換して、バイト配列に対して加工を行い、画像ファイルとして保存するために以下のようなコードを書きました。

    // 画像読み込み
    Bitmap bitmap = new Bitmap(@"D:\temp\moto.bmp");

    /// Bitmapをバイト配列にする
    MemoryStream mms = new MemoryStream();
    bitmap.Save(mms, ImageFormat.Bmp);
    byte[] inputdata = mms.ToArray();
    mms.Close();
    mms.Dispose();

    MemoryStream ms = new MemoryStream(inputdata);
    Bitmap output_bitmap = new Bitmap(ms);
    ms.Close();
    ms.Dispose();

    output_bitmap.Save(@"D:\temp\ato.bmp", ImageFormat.Bmp);

    変数inputdataにはBITMAPフォーマットそのままのバイナリが展開されているとこまで確認したので、BITMAP-BYTE変換は問題ないと思います。
    問題は最後の
    output_bitmap.Save(@"D:\temp\ato.bmp", ImageFormat.Bmp);

    System.Runtime.InteropServices.ExternalException: 'GDI+ で汎用エラーが発生しました。'
    というエラーが出てしまいます。
    "D:\temp\ato.bmp"には54バイトのファイルが生成されており、powershellで「format-hex .\a.bmp」とダンプをとってみると変数inputdataの先頭54バイトと同じものがはいってるぽいです。

    この「'GDI+ で汎用エラーが発生しました。'」の対処法はないでしょうか。
違反を報告
引用返信

▽[全レス2件(ResNo.1-2 表示)]
■35605 / ResNo.1)  Re[1]: bitmapが保存できない
□投稿者/ KOZ 一般人(36回)-(2024/05/04(Sat) 01:13:53)
  • アイコン2024/05/04(Sat) 01:18:08 編集(投稿者)

    No35604に返信(K-1さんの記事)
    > System.Runtime.InteropServices.ExternalException: 'GDI+ で汎用エラーが発生しました。'
    > というエラーが出てしまいます。

    Bitmap を作成するときに使った Stream オブジェクトは破棄しないでください。

    Bitmap output_bitmap = new Bitmap(ms);
    output_bitmap.Save(@"D:\temp\ato.bmp", ImageFormat.Bmp);
    ms.Dispose();

    この順番であればOKです。

    あと、Stream に関しては Close = Dispose ですので、どちらか一方を実行するだけで良いです。

    Stream の実装
    https://referencesource.microsoft.com/#mscorlib/system/io/stream.cs,dc4ffe046b847b84
違反を報告
引用返信
■35606 / ResNo.2)  Re[2]: bitmapが保存できない
□投稿者/ K-1 一般人(2回)-(2024/05/04(Sat) 08:58:28)
  • アイコンNo35605に返信(KOZさんの記事)
    > 2024/05/04(Sat) 01:18:08 編集(投稿者)

    うまくいきました!
    想定通りの画像が保存されていることも確認しました。
    ありがとうございます。
解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-2]






Mode/  Pass/


- Child Tree -