POINT coords;
GetCursorPos(&coords);
Получить текст лэйбла или текстового поля с другого окна
Мне нужна такая штука: запускаю я свою прогу. Запускаю совсем леввую прогу. Навожу на форме левой проги курсор на лэйбл или текстовое поле, а на форме моей проги показывается текст того лэйбла. Как это раелизовать? Помогите!
Копай в сторону SetWindowsHookEx/WH_MOUSE и GetWindowText
Код:
получение текста (в принципе мона еще котроль на что за окно сделать, что бы лишние не хватать)
Код:
GetWindowText(WindowFromPoint(&coords),string,...);
Но скорее всего придется добавить преобразование координат в оконные и делать
Код:
hw = WindowFromPoint(&coords)
ScreenToClient(hw,&coords);
GetWindowText(ChildWindowFromPoint(hw,&coords),string,...);
ScreenToClient(hw,&coords);
GetWindowText(ChildWindowFromPoint(hw,&coords),string,...);
Кстати если через хуки - "локально установленный" не будет обрабатывать чужие окна
Цитата: Yos
контроль курсора (где угодно в цикле если не надо через хуки)
получение текста (в принципе мона еще котроль на что за окно сделать, что бы лишние не хватать)
Но скорее всего придется добавить преобразование координат в оконные и делать
Кстати если через хуки - "локально установленный" не будет обрабатывать чужие окна
Код:
POINT coords;
GetCursorPos(&coords);
GetCursorPos(&coords);
получение текста (в принципе мона еще котроль на что за окно сделать, что бы лишние не хватать)
Код:
GetWindowText(WindowFromPoint(&coords),string,...);
Но скорее всего придется добавить преобразование координат в оконные и делать
Код:
hw = WindowFromPoint(&coords)
ScreenToClient(hw,&coords);
GetWindowText(ChildWindowFromPoint(hw,&coords),string,...);
ScreenToClient(hw,&coords);
GetWindowText(ChildWindowFromPoint(hw,&coords),string,...);
Кстати если через хуки - "локально установленный" не будет обрабатывать чужие окна
Код:
[DllImport("user32.dll")]
private static extern IntPtr WindowFromPoint(POINT Point);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr SendMessage(IntPtr hWnd, uint msg, int wParam, int lParam);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern bool ScreenToClient(IntPtr hWnd, out POINT lpPoint);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern int GetWindowText(IntPtr hWnd, out string lpString, int nMaxCount);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr ChildWindowFromPoint(IntPtr hWndParent, POINT Point);
[StructLayout(LayoutKind.Sequential)]
public struct POINT
{
public int x;
public int y;
}
private void Tick()
{
try
{
POINT pt=new POINT();
pt.x=Control.MousePosition.X;
pt.y=Control.MousePosition.Y;
IntPtr hw = WindowFromPoint(pt);
ScreenToClient(hw, out pt);
string str;
GetWindowText(ChildWindowFromPoint(hw, pt), out str, 255);
System.Diagnostics.Debug.WriteLine(str);
}
catch { }
}
private static extern IntPtr WindowFromPoint(POINT Point);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr SendMessage(IntPtr hWnd, uint msg, int wParam, int lParam);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern bool ScreenToClient(IntPtr hWnd, out POINT lpPoint);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern int GetWindowText(IntPtr hWnd, out string lpString, int nMaxCount);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr ChildWindowFromPoint(IntPtr hWndParent, POINT Point);
[StructLayout(LayoutKind.Sequential)]
public struct POINT
{
public int x;
public int y;
}
private void Tick()
{
try
{
POINT pt=new POINT();
pt.x=Control.MousePosition.X;
pt.y=Control.MousePosition.Y;
IntPtr hw = WindowFromPoint(pt);
ScreenToClient(hw, out pt);
string str;
GetWindowText(ChildWindowFromPoint(hw, pt), out str, 255);
System.Diagnostics.Debug.WriteLine(str);
}
catch { }
}
он при наведении на лейбл ругается на строчку GetWindowText(ChildWindowFromPoint(hw, pt), out str, 255);
The runtime has encountered a fatal error. The address of the error was at 0x79ef067e, on thread 0x10e4. The error code is 0xc0000005. This error may be a bug in the CLR or in the unsafe or non-verifiable portions of user code. Common sources of this bug include user marshaling errors for COM-interop or PInvoke, which may corrupt the stack.
лучше использовать фиксированный массив char-ов
Цитата: Phodopus
str не проинициализирована, где сказано что она способна вместить в себя 255 символов?
лучше использовать фиксированный массив char-ов
лучше использовать фиксированный массив char-ов
Да уже и так объявлял
Код:
string str=new string('0', textLeight);
Код:
HWND hwnd=ChildWindowFromPoint(hw, pt);
int len = GetWindowText(hwnd, NULL, 0);
TCHAR lstr=new TCHAR[len+1];
GetWindowText(hwnd, lstr, len);
// Рабораем со строчкой
// ...........
delete [] lstr;
int len = GetWindowText(hwnd, NULL, 0);
TCHAR lstr=new TCHAR[len+1];
GetWindowText(hwnd, lstr, len);
// Рабораем со строчкой
// ...........
delete [] lstr;
http://pinvoke.net)
StringBuilder sb = new StringBuilder(255);
GetWindowText(ChildWindowFromPoint(hw, pt), sb, 255);
windowtext = sb.ToString(0, len);
попробуй как-нибудь так: (подсмотрено на
StringBuilder sb = new StringBuilder(255);
GetWindowText(ChildWindowFromPoint(hw, pt), sb, 255);
windowtext = sb.ToString(0, len);
Цитата: Phodopus
попробуй как-нибудь так: (подсмотрено на http://pinvoke.net)
StringBuilder sb = new StringBuilder(255);
GetWindowText(ChildWindowFromPoint(hw, pt), sb, 255);
windowtext = sb.ToString(0, len);
StringBuilder sb = new StringBuilder(255);
GetWindowText(ChildWindowFromPoint(hw, pt), sb, 255);
windowtext = sb.ToString(0, len);
Так тоже не работает, к сожалению.
В коде ниже пробовал три варианта: StringBuilder, string и char[] - всё равно выходит ошибка:
FatalExecutionEngineError was detected
Message: The runtime has encountered a fatal error. The address of the error was at 0x79e71bd7, on thread 0x210. The error code is 0xc0000005. This error may be a bug in the CLR or in the unsafe or non-verifiable portions of user code. Common sources of this bug include user marshaling errors for COM-interop or PInvoke, which may corrupt the stack.
Код:
private static bool OnChildWindowEnum(IntPtr hWnd, IntPtr lParam)
{
UnmanagedCode.WINDOWINFO info = new UnmanagedCode.WINDOWINFO();
info.cbSize = (uint)Marshal.SizeOf(info);
UnmanagedCode.GetWindowInfo(hWnd, ref info);
int textLenght = UnmanagedCode.GetWindowTextLength(hWnd);
//StringBuilder strBldr = new StringBuilder(textLenght + 1);
char[] strBldr = new char[textLenght + 1];
//string strBldr = new string(' ', textLenght + 1);
UnmanagedCode.GetWindowText(hWnd, out strBldr, textLenght); // ERROR !!!
bool wndIsActive = info.dwWindowStatus == UnmanagedCode.WS_ACTIVECAPTION;
//Console.WriteLine("Window #{0} Text: \"{1}\" Is Active: {2}", ++wndCount, strBldr.ToString(), wndIsActive);
MessageBox.Show(string.Format("Window #{0} Text: \"{1}\" Is Active: {2}", ++wndCount, strBldr.ToString(), wndIsActive)
, "Сообщение"
, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
//strBldr.Length = 0; // kind of the dispose
if (wndIsActive)
{
// stop enumeration
return false;
}
return true;
}
{
UnmanagedCode.WINDOWINFO info = new UnmanagedCode.WINDOWINFO();
info.cbSize = (uint)Marshal.SizeOf(info);
UnmanagedCode.GetWindowInfo(hWnd, ref info);
int textLenght = UnmanagedCode.GetWindowTextLength(hWnd);
//StringBuilder strBldr = new StringBuilder(textLenght + 1);
char[] strBldr = new char[textLenght + 1];
//string strBldr = new string(' ', textLenght + 1);
UnmanagedCode.GetWindowText(hWnd, out strBldr, textLenght); // ERROR !!!
bool wndIsActive = info.dwWindowStatus == UnmanagedCode.WS_ACTIVECAPTION;
//Console.WriteLine("Window #{0} Text: \"{1}\" Is Active: {2}", ++wndCount, strBldr.ToString(), wndIsActive);
MessageBox.Show(string.Format("Window #{0} Text: \"{1}\" Is Active: {2}", ++wndCount, strBldr.ToString(), wndIsActive)
, "Сообщение"
, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
//strBldr.Length = 0; // kind of the dispose
if (wndIsActive)
{
// stop enumeration
return false;
}
return true;
}
Код:
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern int GetWindowText(IntPtr hWnd, string lpString, int nMaxCount);
string s = new string('\0', 255);
GetWindowText(hwnd, s, 255);
public static extern int GetWindowText(IntPtr hWnd, string lpString, int nMaxCount);
string s = new string('\0', 255);
GetWindowText(hwnd, s, 255);
Либо так:
Код:
[DllImport("user32.dll", CharSet = CharSet.Unicode]
public static extern int GetWindowText(IntPtr hWnd, char[] lpString, int nMaxCount);
char[] charArray = new char[255];
GetWindowText(hwnd, charArray, charArray.Length);
string text = new string(charArray);
public static extern int GetWindowText(IntPtr hWnd, char[] lpString, int nMaxCount);
char[] charArray = new char[255];
GetWindowText(hwnd, charArray, charArray.Length);
string text = new string(charArray);
Код:
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
public static extern int GetWindowText(IntPtr hWnd, StringBuilder sb, int nMaxCount);
StringBuilder sb = new StringBuilder(255);
GetWindowText((IntPtr)0x00030660, sb, sb.MaxCapacity);
string s = sb.ToString();
public static extern int GetWindowText(IntPtr hWnd, StringBuilder sb, int nMaxCount);
StringBuilder sb = new StringBuilder(255);
GetWindowText((IntPtr)0x00030660, sb, sb.MaxCapacity);
string s = sb.ToString();