2011-09-16 5 views
3

밤새 이걸로 싸워 왔습니다. 나는 잘못한 것이 아니라. 바탕 화면 아이콘 + 캡션 크기를 얻으려고합니다. 데스크톱 핸들을 찾아서 SysListView32_hwnd라는 변수에 넣는 함수가 있습니다. Windows 스파이 프로그램이 맞는지 확인했습니다. 여기에 문제가있는 부분이 있습니다.LVM_GETITEMRECT 메시지로 바탕 화면 아이콘 크기를 가져 오는 중

Rectangle rct = new Rectangle(); 
IntPtr pRct = Marshal.AllocHGlobal(Marshal.SizeOf(rct)); 
Marshal.StructureToPtr(rct, pRct, true); 

SendMessage(SysListView32_hwnd, LVM_GETITEMRECT, (IntPtr)0, pRct); 

Rectangle Rect = (Rectangle)Marshal.PtrToStructure(pRct, typeof(Rectangle)); 
Marshal.FreeHGlobal(pRct); 
Debug.WriteLine(Rect.Height + " " + Rect.Width); 

때마다 탐색기가 충돌합니다. C#을 비주얼 스튜디오 2010 윈도우 7 x64 및 내가

+0

탐색기가 충돌하고/어떤 예외를 일으키는 지 알고 계십니까? – jadarnel27

+0

@ jardarnel27 그게 쉽지, SendMessage –

+0

@David 당신을 위해, 아마. 질문에서 프로그램이 불어 나는 곳을 말하는 것이 좋습니다. 그런 식으로 사람들은 추측하거나 추측 할 필요가 없습니다. – jadarnel27

답변

1

이 광범위한 편집하기 전에 원래의 질문을 해결 필요한 경우

Here 내 전체 응용 프로그램입니다 64 비트 프로그램으로 컴파일하고있다.

실패 때문에 당신이 대상 창 핸들을 소유하는 과정에서 호출 할 때만 사용할 수 있습니다 쓴 방법. 이것은 포인터를 전달하기 때문이며, 이는 프로세스에서만 유효합니다. 다른 프로세스에 도착하자마자 의미가없는 주소를 나타냅니다. 그리고 비록 그것이 무언가를 의미한다고하더라도, 프로세스는 시스템으로부터 도움을 받아 다른 프로세스 메모리를 읽을 수 없습니다. 자연 탐험가 폭탄.

용액 탐색 프로세스에 메모리를 할당 VirtualAllocEx()을 사용하는 것이다. 그런 다음 메시지를 보냅니다. 그런 다음 ReadProcessMemory()을 사용하여 rect의 내용을 프로세스로 다시 마샬링하십시오. 이에 가장 많이 인용되는 코드 샘플은 Code Project article입니다. 이 예제는 LVM_GETITEMTEXT을 사용하고 있지만 원칙은 동일합니다.

2

는이 질문에 대한 광범위한 편집에 묻는 추가 질문을 해결합니다. 우리가 LVITEMs하지만 VirtualAllocExsizeof(uint)를 지정하여 작업하는 것처럼

그것은 나에게 보인다.

VirtualAllocEx()dwSize 파라미터의 문서 MSDN에 상태 : 메모리 영역

크기는 바이트 할당. lpAddress가 NULL 인 경우

는, 함수는 다음 페이지 경계까지 dwSize를 반올림합니다.

lpAddress가 NULL 인 경우, 함수는 lpAddress에서 lpAddress + dwSize의 범위에서 하나 이상의 바이트를 포함하는 모든 페이지를 할당합니다. 예를 들어, 페이지 경계를 넘는 2 바이트 범위는 함수가 두 페이지를 할당하게합니다. 즉

그것은 전체 페이지를 할당합니다. 페이지가 4KB이므로 운이 좋습니다. dwSize이 필요한 버퍼에 충분한 지 확인해야합니다.

이유는 무엇입니까 pszText = (IntPtr입니다) ((int)를 lpBaseAddress + Marshal.SizeOf (대해서 typeof (LVITEM을)))? 그것은 구조의 끝을 가리킬뿐입니다.

예 구조의 끝을 가리 킵니다.요점은 pszText 필드가 LVITEM인데도 호출자가 할당 한 버퍼를 가리켜 야한다는 것입니다. 누구든지이 코드를 작성하면 구조체 끝에 여분의 버퍼 공간을 사용하기로 결정했습니다. 구조체는 pszText에 256 바이트가 포함되어 있다고 선언하므로 4KB 페이지의 나머지 부분에 쉽게 맞습니다. 따라서 작동하지만 약간 불투명합니다.

+1

그래, 이해 못해서 고마워. –

+0

+1 모두 우수 답변입니다. – jadarnel27