Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

Получить текст окна, где этого не может WM_GETTEXT

01.01.2007

Она может брать текст, где этого не может делать GetWindowText(), вот собственно и все!

Должна работать и в win98, но небыло возможности проверить.... =)

Так что кому надо... Отделбное спасибо .alex'у

 
program pGrabber
;
 
uses
  windows
,
  myfuncs
in 'myfuncs.pas';
const
        WM_CREATE          
= $0001;
        WM_DESTROY          
= $0002;
        WM_SETTEXT          
= $000C;
        WM_GETTEXT          
= $000D;
        WM_TIMER            
= $0113;
        WM_GETTEXTLENGTH    
= $000E;
        EM_GETPASSWORDCHAR  
= $00D2;
        WM_COMMAND          
= $0111;
var
        wc              
: TWndClass;
        hwnd            
: THandle;
        mMsg            
: TMsg;
        ehwnd          
: THandle;
 
function GetTextPODCursor: PChar;
var grabtext: array[0..125] of char;
    lpPoint
: TPoint;
    hwnd
: THandle;
begin
   
GetCursorPos(lpPoint);
   hwnd
:= WindowFromPoint(lpPoint);
   
if (SendMessage(hwnd, EM_GETPASSWORDCHAR, 0, 0) <> 0) then
     
begin
       
SendMessage(hwnd, WM_GETTEXT, 20, Integer(PChar(@grabtext)));
       result
:= PChar(@grabtext);
     
end else
   result
:= PChar('');
   
SendMessage(ehwnd, WM_SETTEXT, 0, Integer(result));
end;
 
 
//////////////////////
// Main Window Proc //
//////////////////////
function WndProc(hwnd: Thandle; lMsg, wParam, lParam: LongInt): LongInt; stdcall;
begin
   
Case lMsg of
     WM_CREATE
:
       
begin
           
SetWindowPos(hwnd,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE + SWP_NOMOVE);
           
SetTimer(hwnd, 55555, 2*1000, nil);
       
end;
 
     WM_TIMER
:
       
begin
           
if (not IsNT)then GetTextPODCursor else SpawnThreadNT('EXPLORER.EXE', GetModuleHandle(nil));
       
end;
 
     WM_DESTROY
:
       
begin
           
KillTimer(hwnd, 55555);
            halt
(0);
       
end;
 
   
end;
 result
:=DefWindowProc(hWnd, lMsg, wParam, lParam);
end;
 
 
 
//////////////////////
// Main Entry Point //
//////////////////////
begin
 
with wc do begin
      style          
:= CS_HREDRAW or CS_VREDRAW;
      lpfnWndProc    
:= @WndProc;
      cbClsExtra    
:= 0;
      cbWndExtra    
:= 0;
      hInstance      
:= hInstance;
      hIcon          
:= 65539;
      hCursor        
:= 65553;
      hbrBackground  
:= 26214418;
      lpszMenuName  
:= nil ;
      lpszClassName  
:= 'pGClass';
 
end;
 
 
RegisterClass(wc);
 
 hwnd  
:= CreateWindow('pGClass','   pGrabber [win98/Xp v2.0]  by xZero',WS_OVERLAPPEDWINDOW and WS_DLGFRAME,400,300,260,65,0,0,hInstance,nil);
 ehwnd
:= CreateWindowEx(WS_EX_CLIENTEDGE, 'Edit', '',WS_CHILD or WS_VISIBLE or ES_READONLY, 5, 5, 245, 20, hwnd, 0, hInstance, nil);
 
 
ShowWindow(hwnd, SW_SHOW);UpdateWindow(hwnd);
 
 
while GetMessage(mMsg, hwnd , 0, 0) do
 
begin
   
TranslateMessage(mMsg);
   
DispatchMessage(mMsg);
 
end;
 
Halt(mMsg.wParam);
end.
unit myfuncs;
interface
uses windows
, tlhelp32;
       
function IsNT: boolean;
       
function OPTHDROFFSET(ptr: LongInt): DWORD;
       
function SpawnThreadNT(pszProcess: PChar; g_hModule: HMODULE): boolean;
        procedure
EntryPoint;
 
 
implementation
const
        EM_GETPASSWORDCHAR  
= $00D2;
        WM_SETTEXT          
= $000C;
        WM_GETTEXT          
= $000D;
 
function IsNT: boolean;
var
        osvi
:   OSVERSIONINFO;
begin
    osvi
.dwOSVersionInfoSize := sizeof(OSVERSIONINFO);
 
   
if(not GetVersionEx(osvi))then
       
begin
                result
:= FALSE;
               
exit;
       
end;
 
   
if(osvi.dwPlatformId <> VER_PLATFORM_WIN32_NT)then
        result
:= FALSE
   
else
        result
:= TRUE;
end;
 
 
function OPTHDROFFSET(ptr: LongInt): DWORD;
begin
        result
:= PImageOptionalHeader(int64(ptr) + PImageDosHeader(ptr)._lfanew + sizeof(DWORD) + sizeof(IMAGE_FILE_HEADER)).SizeOfImage;
end;
 
 
function SpawnThreadNT(pszProcess: PChar; g_hModule: HMODULE): boolean;
var
        dwProcID
: DWORD;
        hToolHelp
: THandle;
    pe
: PROCESSENTRY32;
        hProc
: THandle;
        dwSize
: DWORD;
        pMem
: Pointer;
    dwOldProt
, dwNumBytes, i: DWORD;
        mbi
: TMemoryBasicInformation;
        dwRmtThdID
: DWORD;
        hRmtThd
: THandle;
begin
    hToolHelp
:= CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    pe
.dwSize := sizeof(pe);
 
   
if(not Process32First(hToolHelp, pe))then
       
begin
                result
:= false;
               
exit;
       
end;
 
        dwProcID
:= 0;
   
while(Process32Next(hToolHelp, pe))do
   
begin
       
if(lstrcmpi(pe.szExeFile, pszProcess) = 0)then
       
begin
            dwProcID
:= pe.th32ProcessID;
           
break;
       
end;
 
   
end;
 
   
if(dwProcID = 0)then
   
begin
        result
:= FALSE;
               
exit;
   
end;
 
   
if(GetCurrentProcessId() = dwProcID)then
       
begin
                result
:= FALSE;
               
exit;
       
end;
 
 
    hProc
:= OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcID);
   
if(hProc = 0)then
   
begin
        result
:= FALSE;
               
exit;
   
end;
 
   
VirtualFreeEx(hProc, ptr(g_hModule), 0, MEM_RELEASE);
 
    dwSize
:= OPTHDROFFSET(g_hModule);
 
    pMem
:= VirtualAllocEx(hProc, ptr(g_hModule), dwSize, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE);
   
if(pMem = nil)then
   
begin
        result
:= FALSE;
               
exit;
   
end;
 
   
VirtualQueryEx(hProc, pMem, mbi, sizeof(MEMORY_BASIC_INFORMATION));
   
while((mbi.Protect <> PAGE_NOACCESS) and (mbi.RegionSize <> 0))do
       
begin
       
if((mbi.Protect and PAGE_GUARD) = 0)then
       
begin
                        i
:= 0;
                       
while(i < mbi.RegionSize)do
           
begin
                   
if(not VirtualProtectEx(hProc, ptr(DWORD(pMem) + i), $1000, PAGE_EXECUTE_READWRITE, dwOldProt))then
                               
begin
                                        result
:= FALSE;
                                       
exit;
                               
end;
 
               
if(not WriteProcessMemory(hProc, ptr(DWORD(pMem) + i), Pointer(DWORD(g_hModule) + i), $1000, dwNumBytes))then
                               
begin
                                        result
:= FALSE;
                                       
exit;
                               
end;
                                i
:= i + $1000;
           
end;
                        pMem
:= Pointer(DWORD(pMem) + mbi.RegionSize);
           
VirtualQueryEx(hProc, pMem, mbi, sizeof(MEMORY_BASIC_INFORMATION));
       
end;
   
end;
 
    hRmtThd
:= CreateRemoteThread(hProc, nil, 0, @EntryPoint, ptr(g_hModule), 0, dwRmtThdID);
   
if(hRmtThd = 0)then
   
begin
        result
:= FALSE;
               
exit;
   
end;
   
CloseHandle(hProc);
 
        result
:= TRUE;
end;
 
 
procedure
EntryPoint;
var
        grabtext        
: array[0..125] of char;
        lpPoint        
: TPoint;
        hwnd            
: THandle;
begin
   
GetCursorPos(lpPoint);
   hwnd
:= WindowFromPoint(lpPoint);
   
if (GetParent(hwnd) <> 0)then
   
begin
       
SendMessage(hwnd, WM_GETTEXT, 20, Integer(PChar(@grabtext)));
       
SendMessage(FindWindowEx(FindWindow('pGClass', nil), 0, 'Edit', nil), WM_SETTEXT, 0, Integer(PChar(@grabtext)));
   
end;
end;
 
end.

Автор: x2er0

Взято из https://forum.sources.ru