using System.Runtime.InteropServices;
[DllImport("user32.DLL")]
public static extern int SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);
[DllImport("user32.DLL")]
public static extern IntPtr FindWindow(string lpszClass, string lpszWindow);
[DllImport("user32.DLL")]
public static extern IntPtr FindWindowEx(IntPtr hwndParent,
IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
[DllImport("user32.dll")]
public static extern uint GetWindowThreadProcessId(IntPtr hWnd,
out uint dwProcessId);
public const uint PROCESS_VM_OPERATION= 0x0008;
public const uint PROCESS_VM_READ= 0x0010;
public const uint PROCESS_VM_WRITE = 0x0020;
[DllImport("kernel32.dll")]
public static extern IntPtr OpenProcess(uint dwDesiredAccess,
bool bInheritHandle, uint dwProcessId);
public const uint MEM_COMMIT = 0x1000;
public const uint MEM_RELEASE = 0x8000;
public const uint MEM_RESERVE = 0x2000;
public const uint PAGE_READWRITE= 4;
[DllImport("kernel32.dll")]
public static extern IntPtr VirtualAllocEx(IntPtr hProcess, IntPtr lpAddress,
uint dwSize, uint flAllocationType, uint flProtect);
[DllImport("kernel32.dll")]
public static extern bool VirtualFreeEx(IntPtr hProcess, IntPtr lpAddress,
uint dwSize, uint dwFreeType);
[DllImport("kernel32.dll")]
public static extern bool CloseHandle(IntPtr handle);
[DllImport("kernel32.dll")]
public static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress,
IntPtr lpBuffer, int nSize, ref uint vNumberOfBytesRead);
public const int WM_USER = 0x0400;
public const int TB_BUTTONCOUNT= WM_USER + 24;
public const int TB_GETBUTTONTEXTW = WM_USER + 75;
private void button1_Click(object sender, EventArgs e)
{
IntPtr vHandle = FindWindow("Shell_TrayWnd", null);
vHandle = FindWindowEx(vHandle, IntPtr.Zero, "ReBarWindow32", null);
vHandle = FindWindowEx(vHandle, IntPtr.Zero, "MSTaskSwWClass", null);
vHandle = FindWindowEx(vHandle, IntPtr.Zero, "ToolbarWindow32", null);
int vCount = SendMessage(vHandle, TB_BUTTONCOUNT, 0, 0);
uint vProcessId;
GetWindowThreadProcessId(vHandle, out vProcessId);
IntPtr vProcess = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ |
PROCESS_VM_WRITE, false, vProcessId);
IntPtr vPointer = VirtualAllocEx(vProcess, IntPtr.Zero, 0x1000,
MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
char[] vBuffer = new char[256];
uint vNumberOfBytesRead = 0;
try
{
for (int i = 0; i < vCount; i++)
{
SendMessage(vHandle, TB_GETBUTTONTEXTW, i, vPointer.ToInt32());
ReadProcessMemory(vProcess, vPointer,
Marshal.UnsafeAddrOfPinnedArrayElement(vBuffer, 0),
vBuffer.Length * sizeof(char), ref vNumberOfBytesRead);
int l = 0;
for (int j = 0; j < vBuffer.Length; j++)
{
if (vBuffer[j] == (char)0)
{
l = j;
break;
}
}
Console.WriteLine(new string(vBuffer, 0, l));
}
}
finally
{
VirtualFreeEx(vProcess, vPointer, 0, MEM_RELEASE);
CloseHandle(vProcess);
}
}
//-------Delphi-------
uses CommCtrl;
procedure TForm1.Button1Click(Sender: TObject);
var
vHandle: THandle;
vCount: Integer;
I: Integer;
vProcessID: THandle;
vProcess: THandle;
vNumberOfBytesRead: DWORD;
vPointer: Pointer;
vBuffer: array[0..255] of Char;
begin
vHandle := FindWindow('Shell_TrayWnd', nil);
vHandle := FindWindowEx(vHandle,0,'ReBarWindow32', nil);
vHandle := FindWindowEx(vHandle,0,'MSTaskSwWClass', nil);
vHandle := FindWindowEx(vHandle,0,'ToolbarWindow32', nil);
vCount := SendMessage(vHandle, TB_BUTTONCOUNT,0,0);
GetWindowThreadProcessId(vHandle,@vProcessId);
vProcess := OpenProcess(PROCESS_VM_OPERATION or PROCESS_VM_READ or
PROCESS_VM_WRITE, False, vProcessId);
vPointer := VirtualAllocEx(vProcess, nil,$1000, MEM_RESERVE or MEM_COMMIT,
PAGE_READWRITE);
try
for I :=0 to vCount -1 do
begin
SendMessage(vHandle, TB_GETBUTTONTEXT, I, Integer(vPointer));
ReadProcessMemory(vProcess, vPointer,@vBuffer,
SizeOf(vBuffer), vNumberOfBytesRead);
OutputDebugString(@vBuffer);
end;
finally
VirtualFreeEx(vProcess, vPointer,0, MEM_RELEASE);
CloseHandle(vProcess);
end;
end;