PDA

View Full Version : سوال: خواندن كپشن Statusbar يك برنامه ديگر با استفاده از C#‎‎و تابع SendMessage و SB_GETTEXT



Sub Zero
یک شنبه 14 شهریور 1389, 17:10 عصر
با سلام خدمت همه دوستان

بنا به ضرورت مجبورم از طريق برنامه خودم , كپشن StatusBar يه برنامه ديگه رو بخونم
مثلا ميخوام مقاديري كه در StatusBar برنامه NotePad هست رو بخونم (مثلا ) . هر چي توي اينترنت گشتم راه حل درست و حسابي براي اين كار پيدا نكردم فقط متوجه شدم اين كار از طريق تابع SendMessage و استفاده از پارامترSB_GETTEXT و يه سري توابع وپارامترهاي ديگه امكان پذيره .

مراحلي كه تا حالا پيش رفتم :

با استفاده از تابع FindWindow هندل برنامه مورد نظر رو به دست آوردم
با استفاده از تابع FindWindowEX هندل StatusBar برنامه مورد نظر رو به دست آوردم

كدها يا راه حلي كه لازم دارم :

به دست آوردن تعداد پارتها يا قسمتهاي StatusBar
به دست آوردن تعداد كاراكترهاي كپشن قسمت مورد نظرم جهت تعريف اندازه بافر براي نگهداري مقدار (كپشن خوانده شده )
تبديل كاراكترهاي ريخته شده در بافر به كاراكترهاي قابل فهم .

درجمع بندي كه از سرچ توي وب به دست اوردم مراحل بالا بايد انجام بشه اما چطوري ???


لطفا اگه كسي در اين زمينه اطلاعاتي داره راهنمايي كنه

Sub Zero
پنج شنبه 18 شهریور 1389, 23:00 عصر
بعد از مدتها گشت و گذار در اينترنت تونستم يك تابع براي اين كار بنويسم اما باز هم خروجي اين تابع قابل قبول نيست لطفا در اين مورد نظر بدين

تابع زير هندل Statusbar و قسمت مورد نظر رو مي گيره و تكستش رو بر مي گردونه

public unsafe static string GetPanelText(IntPtr hStatusBar, int pos)
{

IntPtr hwnd = (IntPtr)GetAncestor(hStatusBar,2);
string text;
const int BUFFER_SIZE = 0x1000;

byte[] localBuffer = new byte[BUFFER_SIZE];

Int32 processId = 0;

Int32 threadId = GetWindowThreadProcessId( hwnd, ref processId);

int hProcess = OpenProcess(ProcessRights.ALL_ACCESS , 0, processId);

if (hProcess == 0) { return null; }

IntPtr ipRemoteBuffer = VirtualAllocEx(

new IntPtr(hProcess),

IntPtr.Zero,

new UIntPtr(BUFFER_SIZE),

MemAllocationType.COMMIT ,

MemoryProtection.PAGE_READWRITE);

if (ipRemoteBuffer == IntPtr.Zero) { return null; }

fixed (byte* pLocalBuffer = localBuffer)
{

IntPtr ipLocalBuffer = new IntPtr(pLocalBuffer);

int chars = (int)SendMessage(hStatusBar, (int)SB_GETTEXT, pos, ipRemoteBuffer);

if (chars == -1) { return null; }

Int32 dwBytesRead = 0;

IntPtr ipBytesRead = new IntPtr(&dwBytesRead);

bool b4 = ReadProcessMemory(

new IntPtr(hProcess),

ipRemoteBuffer,

ipLocalBuffer,

new UIntPtr(BUFFER_SIZE),

ipBytesRead);

if (!b4) { return null; }

text = Marshal.PtrToStringUni(ipLocalBuffer, ipRemoteBuffer);

if (text == " ") text = String.Empty;

}

VirtualFreeEx(

new IntPtr(hProcess),

ipRemoteBuffer,

UIntPtr.Zero,

MemAllocationType.RELEASE);

CloseHandle(new IntPtr(hProcess));

return text;

}

Saman_12
پنج شنبه 18 شهریور 1389, 23:04 عصر
توی چند پست قبل یک کد برای بدست آوردن کپشن هست شاید به دردتون خورد.