C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

ツリー一括表示

他のプロセスのリストビューの内容を取得する /波留男 (20/10/06(Tue) 17:40) #95880
Re[1]: 他のプロセスのリストビューの内容を取得する /魔界の仮面弁士 (20/10/06(Tue) 20:13) #95883
  └ Re[2]: 他のプロセスのリストビューの内容を取得する /波留男 (20/10/07(Wed) 11:54) #95885
    └ Re[3]: 他のプロセスのリストビューの内容を取得する /魔界の仮面弁士 (20/10/07(Wed) 12:50) #95887
      └ Re[4]: 他のプロセスのリストビューの内容を取得する /波留男 (20/10/08(Thu) 08:38) #95899
        └ Re[5]: 他のプロセスのリストビューの内容を取得する /魔界の仮面弁士 (20/10/08(Thu) 11:30) #95910
          └ Re[6]: 他のプロセスのリストビューの内容を取得する /波留男 (20/10/09(Fri) 13:16) #95922
            └ Re[7]: 他のプロセスのリストビューの内容を取得する /魔界の仮面弁士 (20/10/09(Fri) 14:38) #95926
              └ Re[8]: 他のプロセスのリストビューの内容を取得する /波留男 (20/10/10(Sat) 14:08) #95936 解決済み


親記事 / ▼[ 95883 ]
■95880 / 親階層)  他のプロセスのリストビューの内容を取得する
□投稿者/ 波留男 (1回)-(2020/10/06(Tue) 17:40:51)

分類:[.NET 全般] 

初めまして、よろしくお願いいたします。
さて、希望したいことは、他のプロセスのリストビューの内容を取得するということです。
http://mt-soft.sakura.ne.jp/web_dl/vb-parts/get_listview/ さんのコード(VB20008)を例に試しておりますが、
HP内で「WindowsNT系(32bit)用です。95/98/Me、および、64bitCPUは本方式では不可」と書かれていますので
確かに、32OSでは正常に動作するまで何とかこぎつけました。が、
私の環境は、64OSですので、動作しないことになるのですが、確かにどうやってもうまくいきません。
他のプロセスは64ビットで動作しているのを確認しました。
中身を見ると以下のところでエラーになっているようです 。intRc が1になっている
intRc = WriteProcessMemory(hProc, lpShared1, li, Marshal.SizeOf(li), lWritten) '書込み
intRc = SendMessage(hWnd, LVM_GETITEMW, 0, lpShared1) '取得依頼
intRc = ReadProcessMemory(hProc, lpShared2, strBuffer(0), TEXT_SIZE, 0) '読込
色々64OS対応のコードを探しましたが、見つかりません。どうかご教示願います。
プロジェクトのxxプロパティのコンパイルの対象CPUを「x64」を設定してもうまくいきません。
自機環境
Win10、Visual Basic Express 2013

[ □ Tree ] 返信 編集キー/

▲[ 95880 ] / ▼[ 95885 ]
■95883 / 1階層)  Re[1]: 他のプロセスのリストビューの内容を取得する
□投稿者/ 魔界の仮面弁士 (2856回)-(2020/10/06(Tue) 20:13:33)
No95880 (波留男 さん) に返信
> さて、希望したいことは、他のプロセスのリストビューの内容を取得するということです。
No95760 のように UIAutomation で拾えないでしょうか (未確認)
https://yizm.work/winactor/uiautomation_combobox_listview/


> 確かにどうやってもうまくいきません。
相手のプロセスが管理者実行されていて、
こちらのプロセスはそうではない…という状態にはなっていませんか?


> 他のプロセスは64ビットで動作しているのを確認しました。
> プロジェクトのxxプロパティのコンパイルの対象CPUを「x64」を設定してもうまくいきません。

自身のアプリは、x86 / AnyCPU32bitPreferred / AnyCPU / x64 いずれでも良いのですか?

64bit プロセスから 64bit プロセスの ListView を読み取ろうとしているのか
64bit プロセスから 32bit プロセスの ListView を読み取ろうとしているのか
32bit プロセスから 64bit プロセスの ListView を読み取ろうとしているのか
32bit プロセスから 32bit プロセスの ListView を読み取ろうとしているのか



> http://mt-soft.sakura.ne.jp/web_dl/vb-parts/get_listview/ さんのコード(VB20008)を例に試しておりますが、

そのコード、宣言がいろいろと間違っているように見えます。たとえばここ。

> Private Const LVM_GETITEMW As Integer = &H1005 'アイテムの属性を取得

LVM_GETITEM という定数は、Unicode 版と ANSI 版で値が異なっており、
 Const LVM_GETITEMA As Integer = &H1000 + 5
 Const LVM_GETITEMW As Integer = &H1000 + 75
が正しい値です。&H1005 は ANSI バージョンの値ですね。

それを SendMessageW ではなく SendMessageA で呼び出しているので、
結果的に呼び出せていたのでしょうが、渡している Structure LV_ITEM の宣言も
64 bit 対応になっていないようなので、あまり良いコードでは無さそうです。


構造体宣言はこんな感じになるのかな。動作検証はしていないので無保証。


Private Declare Unicode Function SendMessageW Lib "user32" (hWnd As IntPtr, wMsg As Integer, wParam As IntPtr, ByRef lvi As LV_ITEMW) As IntPtr
#Const NTDDI_WINXP = &H5010000&
#Const NTDDI_VISTA = &H6000000&
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Private Structure LV_ITEMW
  Public mask As UInteger
  Public iItem As Integer
  Public iSubItem As Integer
  Public state As UInteger
  Public stateMask As UInteger
  <MarshalAs(UnmanagedType.LPTStr)> Public lpszText As String
  Public cchTextMax As Integer
  Public iImage As Integer
  Public lParam As IntPtr
#If NTDDI_VERSION >= NTDDI_WINXP Then
  Public iIndent As Integer
  Public iGroupId As Integer
  Public cColumns As UInteger
#End If
#If NTDDI_VERSION >= NTDDI_VISTA Then
  Public puColumns As IntPtr
  Public piColFmt As IntPtr
  Public iGroup As Integer
#End If
End Structure
[ 親 95880 / □ Tree ] 返信 編集キー/

▲[ 95883 ] / ▼[ 95887 ]
■95885 / 2階層)  Re[2]: 他のプロセスのリストビューの内容を取得する
□投稿者/ 波留男 (3回)-(2020/10/07(Wed) 11:54:19)
魔界の仮面弁士 さんへ
早速の返答大変ありがとうございます。
しかしかなりハードルが高いです。ただあきらめる訳にはいきませんので、よろしくお願いいたします。

> No95760 のように UIAutomation で拾えないでしょうか (未確認)
> https://yizm.work/winactor/uiautomation_combobox_listview/
>
私には、難しくてちょっと手が出ませんでした。

> 相手のプロセスが管理者実行されていて、
> こちらのプロセスはそうではない…という状態にはなっていませんか?

フリーの画像位置情報取得ツールのリストビューの内容を取得したいのですが、管理者実行では
無いと思います

>
> 自身のアプリは、x86 / AnyCPU32bitPreferred / AnyCPU / x64 いずれでも良いのですか?
>
> 64bit プロセスから 64bit プロセスの ListView を読み取ろうとしているのか
> 64bit プロセスから 32bit プロセスの ListView を読み取ろうとしているのか
> 32bit プロセスから 64bit プロセスの ListView を読み取ろうとしているのか
> 32bit プロセスから 32bit プロセスの ListView を読み取ろうとしているのか
>
1プロセスにおける32ビットと64ビットの混在のことでしょうか?
ネットには以下
ネィティブアプリケーションの場合、プラットフォームの異なるExeとDllは共存できません。
・x64のExeと x64のDLL ⇒動作する
・x86のExeと x86のDLL ⇒動作する
・x64のExeと x86のDLL ⇒動作しない
・x86のExeと x64のDLL ⇒動作しない
とありました。最近は、64OSが主流なので、他のプロセスが32,64であっても動作してもらえると
助かります。どちらかに絞るなら 画像位置情報取得ツールに順じ64でしょうか。

結果ですが、
1) intRc = WriteProcessMemory(hProc, lpShared1, li, Marshal.SizeOf(li), lWritten) '書込み
2) intRc = SendMessageW(hWnd, LVM_GETITEMW, 0, li) '取得依頼
3) intRc = ReadProcessMemory(hProc, lpShared2, strBuffer(0), TEXT_SIZE, 0) '読込
1)intRc の値が1でうまくいってないと思います
2)画像位置情報取得ツールが終了しまいました。何らかの影響を与えた点では、一歩前進です
1)の実行結果が、ポイントとは思いますが、私には、難しくてまた助言して頂けると助かります。
以下の抜粋ですが変更後コードを掲載いたします

'----------------------
' ウィンドウメッセージ
'----------------------

' 魔界の仮面弁士さんより
Private Declare Unicode Function SendMessageW Lib "user32" _
(hWnd As IntPtr, wMsg As Integer, wParam As IntPtr, ByRef lvi As LV_ITEMW) As IntPtr
#Const NTDDI_WINXP = &H5010000&
#Const NTDDI_VISTA = &H6000000&
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Private Structure LV_ITEMW
Public mask As UInteger
Public iItem As Integer
Public iSubItem As Integer
Public state As UInteger
Public stateMask As UInteger
<MarshalAs(UnmanagedType.LPTStr)> Public lpszText As String
Public cchTextMax As Integer
Public iImage As Integer
Public lParam As IntPtr
#If NTDDI_VERSION >= NTDDI_WINXP Then
  Public iIndent As Integer
  Public iGroupId As Integer
  Public cColumns As UInteger
#End If
#If NTDDI_VERSION >= NTDDI_VISTA Then
  Public puColumns As IntPtr
  Public piColFmt As IntPtr
  Public iGroup As Integer
#End If
End Structure



'------------------------------------
' システム関数
'------------------------------------
   'APIは省略 

'------------------------------------
'リストビュー定義
'------------------------------------

Public Const WC_LISTVIEW As String = "SysListView32"

Private Const LVM_FIRST As Integer = &H1000
Private Const LVM_GETTITEMCOUNT As Integer = (LVM_FIRST + 4) 'アイテムの数を取得
'Private Const LVM_GETITEMW As Integer = &H1005        'アイテムの属性を取得 従来の文
Private Const LVM_GETITEMA As Integer = &H1000 + 5      ' 魔界の仮面弁士さんより変更
Private Const LVM_GETITEMW As Integer = &H1000 + 75      ' 魔界の仮面弁士さんより変更
Private Const LVM_GETHEADER As Integer = &H101F 'ヘッダコントロールを取得
Private Const LVM_GETITEMTEXTA As Decimal = (LVM_FIRST + 45)
Private Const HDM_GETITEMCOUNT As Integer = &H1200
Private Const LVIF_TEXT As Integer = &H1
Private Const LVIF_IMAGE As Integer = &H2
Private Const LVIF_PARAM As Integer = &H4
Private Const LVIF_STATE As Integer = &H8


<StructLayout(LayoutKind.Sequential)> Structure LV_TEXT 'データエリア
Dim sItemText As Byte
End Structure



'------------------------------------
' キーボード
'------------------------------------
'Public Const VK_ESCAPE As Integer = &H1B 'Escape
Public Declare Function GetAsyncKeyState Lib "user32.dll" (ByVal vKey As Integer) As Integer


'-------------------------------
' リストビューボックス文字列取得
'-------------------------------

Public Function MyGetListViewItem(ByRef hWnd As Integer) As String

Dim i, p, k As Integer
Dim Dt As String

Dim pid, tid As Integer 'プロセスID,スレッドID
Dim hProc As Integer 'プロセスハンドル
Dim intRc As Integer

Dim hWndHeader As Integer 'リストビューヘッダのハンドル
Dim nCountRow, nCountCol As Integer '行列数

'----------------------
' 共有メモリアドレス
'----------------------
Dim lpShared1 As Long 'パラメータエリア
Dim lpShared2 As Integer 'データエリア
Dim lWritten As Integer = 0 '書込済バイト数

'----------------------
' リストビューパラメータ
'----------------------
Dim li As New LV_ITEMW 'パラメータ
Const TEXT_SIZE As Integer = 80
Dim strBuffer(TEXT_SIZE) As Byte

MyGetListViewItem = ""

'リストビューの項目(行)数取得
nCountRow = SendMessage(hWnd, LVM_GETTITEMCOUNT, 0, 0)
If nCountRow = 0 Then Exit Function

'リストビューの列数取得
hWndHeader = SendMessage(hWnd, LVM_GETHEADER, 0, 0)
nCountCol = SendMessage(hWndHeader, HDM_GETITEMCOUNT, 0, 0)
If (nCountCol = 0) Then Exit Function

'プロセスIDとスレッドID取得
tid = GetWindowThreadProcessId(hWnd, pid)

'共有メモリ確保
lpShared1 = GetSharedMem(pid, Marshal.SizeOf(li), hProc)
lpShared2 = GetSharedMem(pid, TEXT_SIZE, hProc)

Dt = ""


For i = 0 To nCountRow - 1 '行数分ループ
For k = 0 To nCountCol - 1 '列数分ループ

'メッセージパラメータセット
li.iItem = i '行インデックス
li.iSubItem = k '列インデックス

li.mask = LVIF_STATE '文字情報取得
li.lpszText = lpShared2 '文字格納アドレス
li.cchTextMax = TEXT_SIZE '文字数最大値

intRc = WriteProcessMemory(hProc, lpShared1, li, Marshal.SizeOf(li), lWritten) '書込み
intRc = SendMessageW(hWnd, LVM_GETITEMW, 0, li)          '取得依頼  SendMessageWに変更
intRc = ReadProcessMemory(hProc, lpShared2, strBuffer(0), TEXT_SIZE, 0) '読込


Dim tmp As String
tmp = System.Text.Encoding.Default.GetString(strBuffer)
p = InStr(tmp, vbNullChar) - 1 '文字数
If p > 0 Then Dt = Dt & Left(tmp, p)
Dt &= vbTab 'タブ追加

Next k
Dt &= vbCrLf '改行追加

Next i

'共有メモリ開放
FreeSharedMem(hProc, lpShared1, Marshal.SizeOf(li))
FreeSharedMem(hProc, lpShared2, TEXT_SIZE)

MyGetListViewItem = Dt

End Function

[ 親 95880 / □ Tree ] 返信 編集キー/

▲[ 95885 ] / ▼[ 95899 ]
■95887 / 3階層)  Re[3]: 他のプロセスのリストビューの内容を取得する
□投稿者/ 魔界の仮面弁士 (2857回)-(2020/10/07(Wed) 12:50:50)
2020/10/07(Wed) 14:11:49 編集(投稿者)

No95885 (波留男 さん) に返信
> しかしかなりハードルが高いです。ただあきらめる訳にはいきませんので、よろしくお願いいたします。
普段なら面白がって自分でもコードを書いてしまう所なんですが、今はその余裕が無い…。orz


>>No95760 のように UIAutomation で拾えないでしょうか (未確認)
>>https://yizm.work/winactor/uiautomation_combobox_listview/
> 私には、難しくてちょっと手が出ませんでした。
外部プロセスの操作なら、Codeer.Friendly を nuget して使うのが便利かも。
https://www.codeer.co.jp/CodeAndTool


> フリーの画像位置情報取得ツールのリストビューの内容を取得したいのですが、
そのツールのリストビューを示す AutomationElement か HWND か IAccessible を
取得するところまではできているか確認しようかと思いましたが、
どうやら HWND までは取得できているようですね。

でもなんで ByRef Integer なのでしょう?
> Public Function MyGetListViewItem(ByRef hWnd As Integer) As String


> 1プロセスにおける32ビットと64ビットの混在のことでしょうか?
この場合は単一プロセスではなく、取得元プロセスと取得先プロセスそれぞれの bit 数のことです。

32bit プロセスから 64bit の ListView の情報を取得しようとしたり、
64bit プロセスから 32bit の ListView の情報を取得しようとしたことは
無いのですが、下記に知見がありそうです。
https://www.inasoft.org/webhelp/lv2csv/chapter5.html


> 他のプロセスが32,64であっても動作してもらえると助かります。

LV_ITEM は、OS バージョンおよび 32bit/64bit いずれであるかによって
構造体サイズと各フィールド位置がそれぞれ異なります。

自アプリと相手アプリのビット数が異なるケースも考慮するのであれば、
LV_ITEMW32 / LV_ITEMW64 などと名前を変えて、相手先に合わせたサイズのものを使うか、
あるいは構造体を受け渡すのではなく、bit 数の違いや拡張領域の差異を考慮し、
少し大きめのメモリ領域を用意しておき、メモリポインタに対するオフセットで
読み取った方が良いかもしれません。(読み取りたいのは lpszText までの領域なのですよね?)


> #Const NTDDI_WINXP = &H5010000&
> #Const NTDDI_VISTA = &H6000000&
NTDDI_VERSION の値は、お使いの環境に合わせて定義しておいてください。

https://docs.microsoft.com/ja-jp/cpp/porting/modifying-winver-and-win32-winnt?WT.mc_id=DT-MVP-8907&view=vs-2019


> Private Const LVM_GETITEMTEXTA As Decimal = (LVM_FIRST + 45)
何故 Decimal ?
Option Strict On の時にこの定数を使おうとした場合、問題になると思いますよ。
(API 使用時の曖昧さを防ぐため、今回は Option Strict On を明示しておくことをお奨めします)


> Public Declare Function GetAsyncKeyState Lib "user32.dll" (ByVal vKey As Integer) As Integer
これも宣言が違う。正しくは「(ByVal vKey As Integer) As Short」です。
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getasynckeystate?WT.mc_id=DT-MVP-8907


> '-------------------------------
> ' リストビューボックス文字列取得
> '-------------------------------
こっから先が本題なのでしょうけれど、今はちょっと読み解くほどの余裕が無い…。済みません。
[ 親 95880 / □ Tree ] 返信 編集キー/

▲[ 95887 ] / ▼[ 95910 ]
■95899 / 4階層)  Re[4]: 他のプロセスのリストビューの内容を取得する
□投稿者/ 波留男 (4回)-(2020/10/08(Thu) 08:38:57)
> 外部プロセスの操作なら、Codeer.Friendly を nuget して使うのが便利かも。
> https://www.codeer.co.jp/CodeAndTool
詳しくは理解できていませんが、出来れば、単純に動作する方を希望しています。

> どうやら HWND までは取得できているようですね。
ヘッダー情報や、カラムの内容も取得出来ていますので。ハンドル番号等も合っています

> 32bit プロセスから 64bit の ListView の情報を取得しようとしたり、
> 64bit プロセスから 32bit の ListView の情報を取得しようとしたことは
> 無いのですが、下記に知見がありそうです。
> https://www.inasoft.org/webhelp/lv2csv/chapter5.html
このHPにも辿り着きました。期待しましたがC言語であり、この言語は分からず撃沈です。


> 自アプリと相手アプリのビット数が異なるケースも考慮するのであれば、
> LV_ITEMW32 / LV_ITEMW64 などと名前を変えて、相手先に合わせたサイズのものを使うか、
> あるいは構造体を受け渡すのではなく、bit 数の違いや拡張領域の差異を考慮し、
> 少し大きめのメモリ領域を用意しておき、メモリポインタに対するオフセットで
> 読み取った方が良いかもしれません。(読み取りたいのは lpszText までの領域なのですよね?)
何となくおっしゃっていることは分かります。複雑になるとコードも難解になるので、64bitプロセス
から64bitの組み合わせのみで検討した方が良いかと思っています。

以下行った事
〇Strict Onを指定する
それなりに動作すれば良しをしてましたが、エラー続出です。エラー潰しに変更したら、原形とかけ離れ
何か正解がわからなくなってきました。でもこんなオプションあるとは、勉強になりました。

〇因みに、今回の目的として、選択されたリストビューの内容だけを得たいわけですが、可能なのでしょうか?

PS.
昼間の時間帯や、夜に時間を削って回答してい頂き、大変感謝しております。私も、VB.netで64ビット対応の
コードを検索して何とかこぎつけたいと思っています。よろしくお願いいたします。

[ 親 95880 / □ Tree ] 返信 編集キー/

▲[ 95899 ] / ▼[ 95922 ]
■95910 / 5階層)  Re[5]: 他のプロセスのリストビューの内容を取得する
□投稿者/ 魔界の仮面弁士 (2860回)-(2020/10/08(Thu) 11:30:35)
2020/10/08(Thu) 11:31:53 編集(投稿者)

No95899 (波留男 さん) に返信
>> 外部プロセスの操作なら、Codeer.Friendly を nuget して使うのが便利かも。
> 詳しくは理解できていませんが、出来れば、単純に動作する方を希望しています。

[ツール]-[NuGet パッケージ マネージャー]で
 Codeer.Friendly.Windows.NativeStandardControls
を加えておいてこんな感じ。


'Imports Codeer.Friendly.Windows.NativeStandardControls
'Imports Codeer.Friendly.Windows.Grasp
'Imports Codeer.Friendly.Windows

Dim hWndTop As IntPtr = 〜〜
Dim hwndListView As IntPtr = 〜〜

Dim app As New WindowsAppFriend(hWndTop)
'Dim lv As New NativeListControl(app.FromZTop().GetFromWindowClass("SysListView32")(0))
Dim lv As New NativeListControl(app, hwndListView)

Console.WriteLine("=== SysListView32: 0x{0:X8}, {1}", lv.Handle, lv.View)
Console.WriteLine("選択数:{0}", lv.SelectedIndices.Length)
Dim maxCol = If(lv.View = View.Details, 3, 0)

For r = 0 To lv.ItemCount - 1
  Dim state As LVIS = lv.GetItemState(r, LVIS.FOCUSED Or LVIS.SELECTED)
  Console.Write(If(state.HasFlag(LVIS.FOCUSED), "F", "_"))
  Console.Write(If(state.HasFlag(LVIS.SELECTED), "S", "_"))
  Console.Write("{0,5:N0}", r)
  For c = 0 To maxCol
    Console.Write("|" & lv.GetItemText(r, c))
  Next
  Console.WriteLine()
Next

app.Dispose()
Console.WriteLine("** 実験終了 / Push Any Key...")
Console.ReadKey()



>>https://www.inasoft.org/webhelp/lv2csv/chapter5.html
> このHPにも辿り着きました。期待しましたがC言語であり、この言語は分からず撃沈です。
参考元の言語が何であれ、手順・ロジックの解説や、
使用されている API 情報については参考になるかと。



> 以下行った事
> 〇Strict Onを指定する
細かい事ですが、
「〇」(漢数字のゼロ)ではなく、
「○」(丸記号)を使った方が良いと思います。
[ 親 95880 / □ Tree ] 返信 編集キー/

▲[ 95910 ] / ▼[ 95926 ]
■95922 / 6階層)  Re[6]: 他のプロセスのリストビューの内容を取得する
□投稿者/ 波留男 (5回)-(2020/10/09(Fri) 13:16:56)
>> 外部プロセスの操作なら、Codeer.Friendly を nuget して使うのが便利かも。
>>詳しくは理解できていませんが、出来れば、単純に動作する方を希望しています。
「単純に動作する方」ということで、Codeer.Friendlyの利用となったと思います。
実際、APIを使用するより遥かに簡単なコーディングです。こんなのあるのですね。
結果、コーディングの内容が充実でしたので、以下の疑問が解決すれば、目的達成
というところです。
素晴らしいです。オウサムです。ありがとうございます。
ただ気になっている点があり、2,3質問してよろしいでしょうか?
○配布する場合
 ・制限はありますか?
  HPの確認では、フリーの様ですが、アカウント登録など、またインターネットの環境が必要との
  記述もあったような。
○動作環境
 Friendly.Windows.NativeStandardControlsの使用にあたって、パッケージのインストールが必要でしょうか?
 (他のパソコンでは動作しなかった)また、GitHubDesktopSetup.exeを見つけましたが(これがパッケージ?)、
  サインインを求める画面になったので中止しましたが。
  VB.netのプロジェクトの中に「packages」が作成されていました、その辺の環境など、どのような準備が必要
  でしょうか?
以上よろしくお願いいたします。

 
[ 親 95880 / □ Tree ] 返信 編集キー/

▲[ 95922 ] / ▼[ 95936 ]
■95926 / 7階層)  Re[7]: 他のプロセスのリストビューの内容を取得する
□投稿者/ 魔界の仮面弁士 (2865回)-(2020/10/09(Fri) 14:38:30)
No95922 (波留男 さん) に返信
> 結果、コーディングの内容が充実でしたので、以下の疑問が解決すれば、目的達成

最初に生成する WindowsAppFriend の引数には、Process クラスを渡すこともできます。
状況次第では、API 宣言が全くなくても動作するかも。


> ○配布する場合
>  ・制限はありますか?
いわゆる Apache License 2.0 です。
ソースコードも公開されており、商用利用や改変も自由です。ユーザー登録等も不要です。
https://reikawatanabe.com/whats-apache-license-v2/#Apache_License_20
https://www.nuget.org/packages/Codeer.Friendly.Windows.NativeStandardControls/



> ○動作環境
>  Friendly.Windows.NativeStandardControlsの使用にあたって、パッケージのインストールが必要でしょうか?

【実行環境】の話なら、DLL 群一式を、exe と同じフォルダーに配置するだけで OK です。
ビルド後は、exe を出力したフォルダーに
 Codeer.Friendly.dll
 Codeer.Friendly.Windows.dll
 Codeer.Friendly.Windows.NativeStandardControls.dll
などといった DLL が幾つか配置されていると思いますが、
そのフォルダーをまるごとコピーしてやれば良いという事です。


【開発環境】の場合は、インターネットに接続できるなら、NuGet クライアントに対して
 Codeer.Friendly.Windows.NativeStandardControls
を指定するだけで OK です。パッケージ等の存在を意識する必要はありませんし、
パッケージのダウンロードのためにブラウザーでアクセスしたりする必要もありません。

Visual Studio の NuGet パッケージマネージャーならば、適切なバージョンのダウンロードと
依存するその他の DLL のダウンロード、そして参照設定などを自動的におこなってくれます。


Express 2013 の NuGet PackageManager が古い場合は、
Visual Studio を管理者実行して、環境を更新する必要があるかも知れません。
(手元に環境が無いので確認できませんが…)
https://stackoverflow.com/questions/19926314/nuget-package-manager-not-working-in-vs-express-2013

あるいはコマンドライン版の NuGet クライアントを利用することもできます。
http://yohshiy.blog.fc2.com/blog-entry-236.html
http://blog.livedoor.jp/mokkorosuke/archives/19549213.html

パッケージ単体を手動でダウンロードしたい場合には、
https://www.nuget.org/api/v2/package/Codeer.Friendly.Windows.NativeStandardControls/
にアクセスできますが、今回その必要は無いでしょう。


> GitHubDesktopSetup.exeを見つけましたが(これがパッケージ?)、
それは文字通り、GitHub のためのものでしょうね。今回は関係ないはず。
[ 親 95880 / □ Tree ] 返信 編集キー/

▲[ 95926 ] / 返信無し
■95936 / 8階層)  Re[8]: 他のプロセスのリストビューの内容を取得する
□投稿者/ 波留男 (6回)-(2020/10/10(Sat) 14:08:40)
完成品まで、多々疑問点が発生するかもしれませんが、
中核部分は、魔界の仮面弁士さんの教示くださったコードで何とかなりそうです。

ここで解決とさせて頂きます。ありがとうございました。
併せてまたよろしくお願いいたします。
解決済み
[ 親 95880 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -