SB_GETTEXT
C# Signature:
[DllImport("user32.dll")]
private static extern UInt32 SendMessage(
IntPtr hWnd,
UInt32 wMsg,
IntPtr wParam,
IntPtr lParam
);C++ Signature:
lResult = SendMessage( // returns LRESULT in lResult
(HWND) hWndControl, // handle to destination control
(UINT) SB_GETTEXT, // message ID
(WPARAM) wParam, // = (WPARAM) (INT) iPart;
(LPARAM) lParam // = (LPARAM) (LPSTR) szText;
);Sample Code:
using System;
using System.Runtime.InteropServices;
namespace BBooth
{
public class StatusBar
{
#region Members
private IntPtr _handle;
private string[] _captions;
private int _panelCount;
private int _pid;
#endregion
#region Constructor
public StatusBar(IntPtr hWnd)
{
this._handle = hWnd;
this._panelCount = -1;
this._pid = -1;
}
#endregion
#region Imports
[DllImport("kernel32.dll")]
private static extern IntPtr OpenProcess(
ProcessAccessTypes desiredAccess,
Boolean inheritHandle,
Int32 processId
);
[DllImport("kernel32.dll")]
private static extern int CloseHandle(
IntPtr hObject
);
[DllImport("kernel32.dll")]
private static extern IntPtr VirtualAllocEx(
IntPtr hProcess,
IntPtr address,
UInt32 size,
VirtualAllocExTypes allocationType,
AccessProtectionFlags flags
);
[DllImport("kernel32.dll")]
private static extern bool VirtualFreeEx(
IntPtr hProcess,
IntPtr address,
UInt32 size,
VirtualAllocExTypes dwFreeType
);
[DllImport("kernel32.dll")]
private static extern bool ReadProcessMemory(
IntPtr hProcess,
IntPtr baseAddress,
byte[] buffer,
UInt32 dwSize,
out UInt32 numberOfBytesRead
);
[DllImport("user32.dll")]
private static extern int GetWindowThreadProcessId(
IntPtr hWnd,
out Int32 lpdwProcessId
);
[DllImport("user32.dll")]
private static extern uint SendMessage(
IntPtr hWnd,
UInt32 wMsg,
IntPtr wParam,
IntPtr lParam
);
[DllImport("user32.dll")]
private static extern uint SendMessage(
IntPtr hWnd,
UInt32 wMsg,
UInt32 wParam,
UInt32 lParam
);
#endregion
#region Constants
private const uint WM_USER = 0x0400;
private const uint SB_SETPARTS = WM_USER + 4;
private const uint SB_GETPARTS = WM_USER + 6;
private const uint SB_GETTEXTLENGTH = WM_USER + 12;
private const uint SB_GETTEXT = WM_USER + 13;
#endregion
#region Enumerations
private enum ProcessAccessTypes
{
PROCESS_TERMINATE = 0x00000001,
PROCESS_CREATE_THREAD = 0x00000002,
PROCESS_SET_SESSIONID = 0x00000004,
PROCESS_VM_OPERATION = 0x00000008,
PROCESS_VM_READ = 0x00000010,
PROCESS_VM_WRITE = 0x00000020,
PROCESS_DUP_HANDLE = 0x00000040,
PROCESS_CREATE_PROCESS = 0x00000080,
PROCESS_SET_QUOTA = 0x00000100,
PROCESS_SET_INFORMATION = 0x00000200,
PROCESS_QUERY_INFORMATION = 0x00000400,
STANDARD_RIGHTS_REQUIRED = 0x000F0000,
SYNCHRONIZE = 0x00100000,
PROCESS_ALL_ACCESS = PROCESS_TERMINATE | PROCESS_CREATE_THREAD | PROCESS_SET_SESSIONID | PROCESS_VM_OPERATION |
PROCESS_VM_READ | PROCESS_VM_WRITE | PROCESS_DUP_HANDLE | PROCESS_CREATE_PROCESS | PROCESS_SET_QUOTA |
PROCESS_SET_INFORMATION | PROCESS_QUERY_INFORMATION | STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE
}
private enum VirtualAllocExTypes
{
WRITE_WATCH_FLAG_RESET = 0x00000001, // Win98 only
MEM_COMMIT = 0x00001000,
MEM_RESERVE = 0x00002000,
MEM_COMMIT_OR_RESERVE = 0x00003000,
MEM_DECOMMIT = 0x00004000,
MEM_RELEASE = 0x00008000,
MEM_FREE = 0x00010000,
MEM_PUBLIC = 0x00020000,
MEM_MAPPED = 0x00040000,
MEM_RESET = 0x00080000, // Win2K only
MEM_TOP_DOWN = 0x00100000,
MEM_WRITE_WATCH = 0x00200000, // Win98 only
MEM_PHYSICAL = 0x00400000, // Win2K only
//MEM_4MB_PAGES = 0x80000000, // ??
SEC_IMAGE = 0x01000000,
MEM_IMAGE = SEC_IMAGE
}
private enum AccessProtectionFlags
{
PAGE_NOACCESS = 0x001,
PAGE_READONLY = 0x002,
PAGE_READWRITE = 0x004,
PAGE_WRITECOPY = 0x008,
PAGE_EXECUTE = 0x010,
PAGE_EXECUTE_READ = 0x020,
PAGE_EXECUTE_READWRITE = 0x040,
PAGE_EXECUTE_WRITECOPY = 0x080,
PAGE_GUARD = 0x100,
PAGE_NOCACHE = 0x200,
PAGE_WRITECOMBINE = 0x400
}
#endregion
#region Private Methods
private int GetPanelCount()
{
if (this._handle != IntPtr.Zero)
return (int)SendMessage(this._handle, SB_GETPARTS, 0, 0);
return 0;
}
private string[] GetCaptions()
{
int count = this.PanelCount;
string[] captions = new string[count];
for (uint i = 0; i < count; i++)
captions[i] = this.GetCaption(i);
return captions;
}
private string GetCaption(uint index)
{
uint length = (uint)SendMessage(this._handle, SB_GETTEXTLENGTH, index, 0);
// Low part is the count. High part is the window type. Mask out the high bits.
// The returned text will also be unicode so double the length to accomodate our buffer
length = (length & 0x0000ffff) * 2;Sample Code:
Última actualización