typedef struct tagLVITEM64
{
UINT mask;
int iItem;
int iSubItem;
UINT state;
UINT stateMask;
_int64 pszText;
int cchTextMax;
int iImage;
_int64 lParam;
#if (_WIN32_IE >= 0x0300)
int iIndent;
#endif
#if (_WIN32_WINNT >= 0x0501)
int iGroupId;
UINT cColumns; // tile view columns
_int64 puColumns;
#endif
#if _WIN32_WINNT >= 0x0600
_int64 piColFmt;
int iGroup; // readonly. only valid for owner data.
#endif
} LVITEM64;
void main(){
HWND hDestTop;
hDestTop = ::FindWindow(L"progman", NULL);
hDestTop = ::FindWindowEx(hDestTop, 0, L"shelldll_defview", NULL);
hDestTop = ::FindWindowEx(hDestTop, 0, L"syslistview32", NULL);
int count=(int)::SendMessage( hDestTop, LVM_GETITEMCOUNT, 0, 0);
LVITEM64 lvi, *_lvi;
wchar_t item[512], subitem[512];
wchar_t *_item, *_subitem;
unsigned long pid;
HANDLE process;
GetWindowThreadProcessId( hDestTop, &pid);
process=OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITE|PROCESS_QUERY_INFORMATION, FALSE, pid);
_lvi=(LVITEM64*)VirtualAllocEx(process, NULL, sizeof(LVITEM64), MEM_COMMIT, PAGE_READWRITE);
_item=(wchar_t*)VirtualAllocEx(process, NULL, 512*sizeof(wchar_t), MEM_COMMIT, PAGE_READWRITE);
_subitem=(wchar_t*)VirtualAllocEx(process, NULL, 512*sizeof(wchar_t), MEM_COMMIT, PAGE_READWRITE);
RECT rc;
rc.left = LVIR_ICON; //這個一定要設定 可以去看MSDN關于LVM_GETITEMRECT的說明
RECT* _rc =(RECT*)VirtualAllocEx( process, NULL, sizeof(RECT), MEM_COMMIT, PAGE_READWRITE);
lvi.cchTextMax=512;
for( int i=0; i< count; i++) {
lvi.iSubItem=0;
lvi.pszText=(_int64)_item;
WriteProcessMemory(process, _lvi, &lvi, sizeof(LVITEM64), NULL);
::SendMessage( hDestTop, LVM_GETITEMTEXT, (WPARAM)i, (LPARAM)_lvi);
lvi.iSubItem=1;
lvi.pszText=(_int64)_subitem;
WriteProcessMemory(process, _lvi, &lvi, sizeof(LVITEM64), NULL);
::SendMessage( hDestTop, LVM_GETITEMTEXT, (WPARAM)i, (LPARAM)_lvi);
::WriteProcessMemory( process, _rc, &rc, sizeof(rc), NULL);
::SendMessage( hDestTop, LVM_GETITEMRECT, (WPARAM)i, (LPARAM)_rc);
ReadProcessMemory(process, _item, item, 512*sizeof(wchar_t), NULL);
ReadProcessMemory(process, _subitem, subitem, 512*sizeof(wchar_t), NULL);
ReadProcessMemory(process, _rc, &rc, sizeof(rc), NULL);
_cwprintf(L"%s - %s LF:%d TP:%d RT:%d BT:%d\n", item, subitem, rc.left,rc.top,rc.right,rc.bottom);
}
VirtualFreeEx(process, _lvi, 0, MEM_RELEASE);
VirtualFreeEx(process, _item, 0, MEM_RELEASE);
VirtualFreeEx(process, _subitem, 0, MEM_RELEASE);
VirtualFreeEx(process, _rc, 0, MEM_RELEASE);
CloseHandle( process );
}
原文 網址https://blog.csdn.net/jackflit/article/details/50198955
主要就是想要用vb實作桌面圖示獲取和擺放.xp還可以.win7 64下就不行了.
那個大神可以 實作 付費 也沒問題
uj5u.com熱心網友回復:
只有100分了.不行就留下聯系方式付費也行.感謝各位大神了.uj5u.com熱心網友回復:
付費預算多少?
應該可以,不過有點費事……
首先要判斷作業系統的位數是64位還是32位,然后按相應的資料結構填充資訊就可以了。
uj5u.com熱心網友回復:
如果圖示是已知的,可以不用這么麻煩,只需要兩步即可解決問題。截屏,對比坐標顏色值。
當然,并不嚴謹,但也確實可以解決問題。
uj5u.com熱心網友回復:
http://blog.sina.com.cn/s/blog_7a44d6090101a5o3.htmluj5u.com熱心網友回復:
代碼看起來像外掛程式一樣猛在操作記憶體
。其實這種SDK方式的代碼VB根本是可以直譯的,這也要求人
?還有呀,既然你有C的原始碼,干嘛不直接用VC建一個動態庫的工程編譯一個API給VB呼叫,這樣效果高還不容易出錯,畢竟VB不是直接作業在Win32子系統的,有些東西還是C用起來方便。
uj5u.com熱心網友回復:
看起來很高深的樣子,看得眼花繚亂,建立樓主放棄,或者點這里轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/43637.html
標籤:API
上一篇:Winsecs求助
