實作了一個MFC SDI程式,在主界面有個編輯框CEdit,現在要實作一次拖曳多個檔案顯示在編輯框里面。
我的實作方式是,如果一次拖曳多個檔案就逐一保存,最后統一顯示在CEdit上面。
現在的問題是,選中一堆檔案后,拖曳進界面,打開的順序并不是按照從上到下,而是從中間開始,也就是檔案打開順序是不確定的。
LRESULT CMainFrame::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: Add your specialized code here and/or call the base class
switch (message)
{
case WM_DROPFILES:
{
HDROP hDrop = (HDROP)wParam;
//2.1 引數0xFFFFFFFF ,將獲得拖拽檔案個數
theApp.nDragFileNum = DragQueryFile(hDrop, 0xFFFFFFFF, NULL, 0);
TRACE("drag file ,num is:%d\n", theApp.nDragFileNum);
theApp.openFirstDragDoc = TRUE;
break;
}
}
return CFrameWnd::WindowProc(message, wParam, lParam);
}
我有實作這個訊息并獲取了檔案個數,現在的問題是,能不能有什么辦法可以修改打開檔案的順序?
自己有一個思路,但不知道怎么實作:因為hDrop指向的區域有包含檔案名資訊,現在就是想修改hDrop指向的內容,比如檔案名順序,不知道是否可行?
求大俠告知。
uj5u.com熱心網友回復:
獲得檔案名串列,做個排序uj5u.com熱心網友回復:
檔案名串列可以獲取,排序也可以,但是排完序我要存在哪里。不然 return CFrameWnd::WindowProc(message, wParam, lParam); 這句話上報還是原來的檔案順序。能否麻煩說清楚一點?
uj5u.com熱心網友回復:
有沒有辦法修改mWparam指向的內容?uj5u.com熱心網友回復:
或者有人知道怎么模擬WM_DROPFILES訊息嗎uj5u.com熱心網友回復:
1 DragQueryFileRetrieves the file names of dropped files that have resulted from a successful drag-and-drop operation.
回傳 的 是 path 即(多個) 檔案 名字 , 你 把 它 放入 一個 CStringArray 中,然后 排序 ,再 自己 一個一個 打開 讀出。
放 Edit 中。不要 經過 WindowProc 即
2 不要 break; 而是 return
uj5u.com熱心網友回復:
拖放本質是獲取一堆檔案名的機制,你獲得檔案名之后,你完全自己決定拖進來的檔案名要做什么用uj5u.com熱心網友回復:
獲取檔案串列以后,自己實作后面的處理邏輯~uj5u.com熱心網友回復:
自己定義一個訊息,排序好了通過自定義訊息發過去。uj5u.com熱心網友回復:
僅供參考:void MyGetListViewItem(HWND hWindow) {
int nLVItemCount;
int nColumns;
DWORD dwProcessID;
HANDLE hProcess;
HWND hHeaderCtrl;
LVITEM lvItemLocal;
HDITEM hdItemLocal;
DWORD dwBytesRead, dwBytesWrite;
BOOL bSuccess,bWriteOK;
LPVOID lpTextRemote;
LPVOID lpListItemRemote;
LPVOID lpHeadItemRemote;
int i,j;
GetWindowThreadProcessId(hWindow,&dwProcessID);
hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwProcessID);
if (!hProcess) goto ABORT0;
lpTextRemote=VirtualAllocEx(hProcess,NULL,nMaxLen+1,MEM_COMMIT,PAGE_READWRITE);
if (!lpTextRemote) goto ABORT1;
lpListItemRemote=VirtualAllocEx(hProcess,NULL,sizeof(LVITEM),MEM_COMMIT,PAGE_READWRITE);
if (!lpListItemRemote) goto ABORT2;
lpHeadItemRemote=VirtualAllocEx(hProcess,NULL,sizeof(HDITEM),MEM_COMMIT,PAGE_READWRITE);
if (!lpHeadItemRemote) goto ABORT3;
nLVItemCount=ListView_GetItemCount(hWindow);
hHeaderCtrl =ListView_GetHeader(hWindow);
nColumns =Header_GetItemCount(hHeaderCtrl);
// init();
if (nColumns<=0) {
nColumns=1;
//} else {
ln[0]=0;
for (j=0;j<nColumns;j++) {
ZeroMemory(szBuf,nMaxLen+1);
bWriteOK= WriteProcessMemory(hProcess,lpTextRemote,(LPVOID)szBuf,nMaxLen+1,(LPDWORD)&dwBytesWrite);
if (!bWriteOK) goto ABORT4;
hdItemLocal.mask=HDI_TEXT;
hdItemLocal.cchTextMax=nMaxLen;
hdItemLocal.pszText=(LPTSTR)lpTextRemote;
dwBytesWrite=0;
bWriteOK=WriteProcessMemory(hProcess,lpHeadItemRemote,(LPVOID)&hdItemLocal,sizeof(HDITEM),(LPDWORD)&dwBytesWrite);
if (!bWriteOK) goto ABORT4;
SendMessage(hHeaderCtrl,HDM_GETITEM,(WPARAM)j,(LPARAM)lpHeadItemRemote);
bSuccess=ReadProcessMemory(hProcess,lpTextRemote,szBuf,nMaxLen+1,&dwBytesRead);
if (!bSuccess) goto ABORT4;
if (j>0) strcat(ln,"|");
strstrip(szBuf1,szBuf);
strcat(ln,szBuf1);
}
add1(ln);
}
// printf("ListView的Columns數: %d\n",nColumns);
// printf("---------------------------\n");
if (nLVItemCount<=0) nLVItemCount=1;
for (i=0;i<nLVItemCount;i++) {
ln[0]=0;
for (j=0;j<nColumns;j++) {
ZeroMemory(szBuf,nMaxLen+1);
bWriteOK= WriteProcessMemory(hProcess,lpTextRemote,(LPVOID)szBuf,nMaxLen+1,(LPDWORD)&dwBytesWrite);
if (!bWriteOK) goto ABORT4;
lvItemLocal.iItem=i;
lvItemLocal.iSubItem=j;
lvItemLocal.mask=LVIF_TEXT;
lvItemLocal.cchTextMax=nMaxLen;
lvItemLocal.pszText=(LPTSTR)lpTextRemote;
dwBytesWrite=0;
bWriteOK=WriteProcessMemory(hProcess,lpListItemRemote,(LPVOID)&lvItemLocal,sizeof(LVITEM),(LPDWORD)&dwBytesWrite);
if (!bWriteOK) goto ABORT4;
SendMessage(hWindow,LVM_GETITEMTEXT,(WPARAM)i,(LPARAM)lpListItemRemote);
bSuccess=ReadProcessMemory(hProcess,lpTextRemote,szBuf,nMaxLen+1,&dwBytesRead);
//從指定行程存盤空間讀取文本
if (!bSuccess) goto ABORT4;
if (j>0) strcat(ln,"|");
strstrip(szBuf1,szBuf);
strcat(ln,szBuf1);
}
add1(ln);
}
ABORT4:
VirtualFreeEx(hProcess,lpHeadItemRemote,0,MEM_RELEASE);
ABORT3:
VirtualFreeEx(hProcess,lpListItemRemote,0,MEM_RELEASE);
ABORT2:
VirtualFreeEx(hProcess,lpTextRemote,0,MEM_RELEASE);
ABORT1:
CloseHandle(hProcess);
ABORT0:
// over();
return;
}
uj5u.com熱心網友回復:
再供參考:bool AdjustPrivileges() {
HANDLE hToken;
TOKEN_PRIVILEGES tp;
TOKEN_PRIVILEGES oldtp;
DWORD dwSize=sizeof(TOKEN_PRIVILEGES);
LUID luid;
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) {
if (GetLastError()==ERROR_CALL_NOT_IMPLEMENTED) return true;
else return false;
}
if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid)) {
CloseHandle(hToken);
return false;
}
ZeroMemory(&tp, sizeof(tp));
tp.PrivilegeCount=1;
tp.Privileges[0].Luid=luid;
tp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
/* Adjust Token Privileges */
if (!AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), &oldtp, &dwSize)) {
CloseHandle(hToken);
return false;
}
// close handles
CloseHandle(hToken);
return true;
}
uj5u.com熱心網友回復:
將拖拽出來的檔案填入到一個List控制元件中,然后,設定一個置前置后操作,再顯示到你的Edit中uj5u.com熱心網友回復:
你可以將所有檔案排序處理,或者拖拽的時候,滑鼠點在第一個的上面操作。轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/69993.html
標籤:基礎類
