source: dev/trunk/ab5.0/abdev/abdev/Attach.cpp@ 829

Last change on this file since 829 was 829, checked in by イグトランス (egtra), 12 years ago

svn:eol-styleとsvn:mime-type(文字コード指定含む)の設定

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/plain; charset=Shift_JIS
File size: 7.6 KB
RevLine 
[829]1#include "stdafx.h"
2
3#ifndef THETEXT
4
5#include "common.h"
6#include <abdev/ab_common/include/Path.h>
7#include <abdev/ab_common/include/ProcessAndModule.h>
8#include <psapi.h>
9#include <tlhelp32.h>
10
11#pragma comment(lib, "psapi.lib")
12
13using namespace ActiveBasic::IDE;
14
15HRESULT ApplyDialogTexture( HWND );
16
17
18int GetSelectingProcessId(HWND hListView,DWORD *lpdwPlatform){
19 int nCount;
20 nCount=ListView_GetItemCount(hListView);
21
22 char temporary[255];
23 DWORD dwProcessId;
24 int i;
25 for(i=0;i<nCount;i++){
26 if(ListView_GetItemState(hListView,i,LVIS_SELECTED)){
27 ListView_GetItemText(hListView,i,1,temporary,255);
28 dwProcessId=atoi(temporary);
29
30 ListView_GetItemText(hListView,i,2,temporary,255);
31 if(lstrcmpi(temporary,"Win32")==0) *lpdwPlatform=IMAGE_FILE_MACHINE_I386;
32 else if(lstrcmpi(temporary,"Win64")==0) *lpdwPlatform=IMAGE_FILE_MACHINE_AMD64;
33 break;
34 }
35 }
36 if(i==nCount) return 0;
37
38 return dwProcessId;
39}
40
41void InsertProcess_ToListView(HWND hListView,char const* lpszAppPath,int id,char const* lpszPlatform,char const * lpszTitle){
42 char szAppName[MAX_PATH],temp2[MAX_PATH];
43 _splitpath(lpszAppPath,NULL,NULL,szAppName,temp2);
44 lstrcat(szAppName,temp2);
45
46 //イメージリストを取得
47 HIMAGELIST hImageList;
48 hImageList=ListView_GetImageList(hListView,LVSIL_SMALL );
49
50 //アイコンを取得
51 int iImage;
52 SHFILEINFO shfi;
53 SHGetFileInfo(lpszAppPath, FILE_ATTRIBUTE_ARCHIVE, &shfi, sizeof(SHFILEINFO), SHGFI_ICON | SHGFI_SMALLICON );
54 if(shfi.hIcon){
55 iImage=ImageList_AddIcon(hImageList,shfi.hIcon);
56 DestroyIcon(shfi.hIcon);
57 }
58 else iImage=-1;
59
60 char szId[255];
61 sprintf(szId,"%d",id);
62
63 //リストビューに追加
64 LV_ITEM item;
65 if(iImage==-1) item.mask=LVIF_TEXT;
66 else item.mask=LVIF_TEXT|LVIF_IMAGE;
67 item.iItem=0;
68
69 item.pszText=szAppName;
70 item.iSubItem=0;
71 item.iImage=iImage;
72 ListView_InsertItem(hListView,&item);
73
74 item.mask=LVIF_TEXT ;
75 item.pszText=szId;
76 item.iSubItem++;
77 ListView_SetItem(hListView,&item);
78
79 item.pszText=const_cast<LPSTR>(lpszPlatform);
80 item.iSubItem++;
81 ListView_SetItem(hListView,&item);
82
83 item.pszText=const_cast<LPSTR>(lpszTitle);
84 item.iSubItem++;
85 ListView_SetItem(hListView,&item);
86}
87
88void ListupProcesses64(HWND hListView)
89{
90 ListView_DeleteAllItems(hListView);
91
92
93 /////////////////////////////////////////////////////
94 // 64ビット版プロセス列挙モジュールを呼び出す
95 /////////////////////////////////////////////////////
96
97 std::string enumProcess64ExePath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\enum_process64\\enum_process64.exe";
98
99 STARTUPINFO si;
100 PROCESS_INFORMATION pi;
101 memset(&si,0,sizeof(STARTUPINFO));
102 si.cb=sizeof(STARTUPINFO);
103 CreateProcess(NULL,const_cast<char *>(enumProcess64ExePath.c_str()),NULL,NULL,0,NORMAL_PRIORITY_CLASS,NULL,NULL,&si,&pi);
104
105 WaitForSingleObject(pi.hProcess,INFINITE);
106
107
108 //////////////////////////////////
109 // 生成されたファイルの読み込み
110 //////////////////////////////////
111
112 std::string listPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\enum_process64\\list.dat";
113
114 char *buffer;
115 buffer=ReadBuffer_NonErrMsg( listPath );
116 if(!buffer) return;
117
118 int i=0;
119 char temporary[MAX_PATH];
120 while(1){
121 //ファイルパス
122 char szAppPath[MAX_PATH];
123 i=GetOneParameter(buffer,i,szAppPath);
124 if(szAppPath[0]=='\0') break;
125 RemoveStringQuotes(szAppPath);
126
127 //プロセスID
128 DWORD dwProcessId;
129 i=GetOneParameter(buffer,i,temporary);
130 if(temporary[0]=='\0') break;
131 dwProcessId=(DWORD)atoi(temporary);
132
133 //プラットフォーム
134 char szPlatform[255];
135 i=GetOneParameter(buffer,i,szPlatform);
136 if(temporary[0]=='\0') break;
137
138 //タイトル
139 char szTitle[255];
140 int i2;
141 for(i2=0;;i++,i2++){
142 if(IS_RETURN(buffer,i)||buffer[i]=='\0'){
143 szTitle[i2]=0;
144 break;
145 }
146 szTitle[i2]=buffer[i];
147 }
148
149
150 //リストビューへ追加
151 InsertProcess_ToListView(hListView,szAppPath,dwProcessId,szPlatform,szTitle);
152
153 if(buffer[i]=='\r'&&buffer[i+1]=='\n') i+=2;
154 if(buffer[i]=='\0') break;
155 }
156
157 HeapDefaultFree(buffer);
158}
159
160// EnumWindowsProcコールバック関数
161BOOL CALLBACK FindWindowProc(HWND hwnd, LPARAM lParam)
162{
163 auto pProcessIdAndHWnd = reinterpret_cast<std::pair<DWORD, HWND>*>(lParam);
164 DWORD processId = 0;
165 ::GetWindowThreadProcessId(hwnd, &processId);
166 if (processId == pProcessIdAndHWnd->first)
167 {
168 pProcessIdAndHWnd->second = hwnd;
169 return FALSE;
170 }
171 else
172 {
173 return TRUE;
174 }
175}
176void ListupProcesses(HWND hListView){
177 ListView_DeleteAllItems(hListView);
178
179 //プロセスを列挙
180 auto processIds = ActiveBasic::Common::GetProcesses();
181
182 char szMyAppPath[MAX_PATH] = {};
183 GetModuleFileName(nullptr, szMyAppPath, MAX_PATH);
184
185 BOOST_FOREACH(DWORD processId, processIds)
186 {
187 //そのプロセスにおける実行モジュールのインスタンスハンドルを取得
188 auto executablePath = ActiveBasic::Common::GetExecutableModulePath(processId);
189
190 //////////////////////////////
191 // ウィンドウタイトルを取得
192 //////////////////////////////
193
194 std::pair<DWORD, HWND> processIdAndHWnd(processId, nullptr);
195 EnumWindows(FindWindowProc, reinterpret_cast<LPARAM>(&processIdAndHWnd));
196 HWND hwnd = processIdAndHWnd.second;
197
198 TCHAR szWndTitle[1024] = {};
199 if(hwnd) GetWindowText(hwnd, szWndTitle, 1024);
200
201 if (ActiveBasic::Common::IsPathEqual(Jenga::Common::ToWString(szMyAppPath).c_str(), executablePath.wstring().c_str()))
202 {
203 //自分自身(ProjectEditor.exe)は無視
204 continue;
205 }
206
207 //リストビューへ追加
208 InsertProcess_ToListView(hListView,executablePath.string().c_str(),processId,"Win32",szWndTitle);
209 }
210}
211
212INT_PTR CALLBACK DlgAttach(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
213 static HWND hListView;
214 static HIMAGELIST hImageList;
215 static DWORD *lpdwPlatform;
216 switch(message){
217 case WM_INITDIALOG:
218 SetPosCenter(hwnd);
219
220 lpdwPlatform=(DWORD *)lParam;
221
222 hListView=GetDlgItem(hwnd,IDC_PROCESSLIST);
223
224 //拡張スタイル
225 DWORD dwStyle;
226 dwStyle=ListView_GetExtendedListViewStyle(hListView);
227 dwStyle|=LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES;
228 ListView_SetExtendedListViewStyle(hListView,dwStyle);
229
230
231 //イメージリストの生成と設定
232 hImageList=ImageList_Create(16,16,ILC_COLOR24|ILC_MASK,0,0);
233 ListView_SetImageList(hListView,hImageList,LVSIL_SMALL );
234
235
236 ///////////////////////////
237 // カラムをセット
238 ///////////////////////////
239
240 LV_COLUMN ListView_Column;
241 ListView_Column.mask=LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
242 ListView_Column.fmt=LVCFMT_LEFT;
243
244 ListView_Column.cx=150;
245 ListView_Column.pszText="プロセス名";
246 ListView_Column.iSubItem=0;
247 ListView_InsertColumn(hListView,ListView_Column.iSubItem,&ListView_Column);
248
249 ListView_Column.cx=70;
250 ListView_Column.pszText="ID";
251 ListView_Column.iSubItem++;
252 ListView_InsertColumn(hListView,ListView_Column.iSubItem,&ListView_Column);
253
254 ListView_Column.cx=50;
255 ListView_Column.pszText="種別";
256 ListView_Column.iSubItem++;
257 ListView_InsertColumn(hListView,ListView_Column.iSubItem,&ListView_Column);
258
259 ListView_Column.cx=200;
260 ListView_Column.pszText="タイトル";
261 ListView_Column.iSubItem++;
262 ListView_InsertColumn(hListView,ListView_Column.iSubItem,&ListView_Column);
263
264
265 //リスビューを更新
266 if(IsWow64()) ListupProcesses64(hListView);
267 else ListupProcesses(hListView);
268
269 ApplyDialogTexture(hwnd);
270 break;
271 case WM_COMMAND:
272 switch(LOWORD(wParam)){
273 case IDOK:
274 EndDialog(hwnd,GetSelectingProcessId(hListView,lpdwPlatform));
275 return 1;
276 case IDCANCEL:
277 EndDialog(hwnd,0);
278 return 1;
279 }
280 return 0;
281
282 case WM_NOTIFY:
283 NMLISTVIEW *nmListView;
284 nmListView=(NMLISTVIEW *)lParam;
285 if(nmListView->hdr.hwndFrom==hListView){
286 if(nmListView->hdr.code==NM_DBLCLK){
287 if(nmListView->iItem==-1) return 1;
288 SendMessage(hwnd,WM_COMMAND,IDOK,0);
289 return 1;
290 }
291 }
292 break;
293
294 case WM_DESTROY:
295 ImageList_Destroy(hImageList);
296 return 1;
297 }
298 return 0;
299}
300
301
302#endif //THETEXT
Note: See TracBrowser for help on using the repository browser.