Ansonsten nimm halt ein AutoIt-Script für den Auslesepart. Ist zwar eine schlechte Lösung, aber immerhin ist es eine =S
Fremdes Fenster auslesen
-
- [C++]
- FragSalat
- Geschlossen
-
-
-
Ihr und euer AutoIt ich hasse den kram^^
@andrehaenel dein tool funzt also ich bekomme den text
und die id hab ich jetzt auch ich teste mal
magste mir noch verraten wie du das gemacht hast^^
also die enum id ermitteln^^ich habs mit
int CtrlID = GetDlgCtrlID( hwnd );
if (CtrlID == 283){...versucht aber da bekomme ich den text von i-nem button^^
-
Einfach das Window Hanlde enummeriert, und dann die liste durchgegangen bis das Control Handle kam.
Ist halt alles in c# also bringen code-snippets nichts. -
-
zeig ma tzrotzdem pls mit window handle enumerieren hab ichs nicht so^^ besser gesagt ich hab grad kp was du damit meinst^^
meinste die handles nach größe sortieren und dann ne id verpassen oder was^^
-
Die Methoden:
[cs][DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
internal static extern int GetWindowText(IntPtr hWnd, [Out] StringBuilder lpString, int nMaxCount);[DllImport("user32")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool EnumChildWindows(IntPtr window, EnumWindowProc callback, IntPtr i);public delegate bool EnumWindowProc(IntPtr hWnd, IntPtr parameter);
public static List<IntPtr> GetChildWindows(IntPtr parent)
{
List<IntPtr> result = new List<IntPtr>();
GCHandle listHandle = GCHandle.Alloc(result);
try
{
EnumWindowProc childProc = new EnumWindowProc(EnumWindow);
EnumChildWindows(parent, childProc, GCHandle.ToIntPtr(listHandle));
}
finally
{
if (listHandle.IsAllocated)
listHandle.Free();
}
return result;
}private static bool EnumWindow(IntPtr handle, IntPtr pointer)
{
GCHandle gch = GCHandle.FromIntPtr(pointer);
List<IntPtr> list = gch.Target as List<IntPtr>;
if (list == null)
{
throw new InvalidCastException("GCHandle Target could not be cast as List<IntPtr>");
}
list.Add(handle);
return true;
}const uint WM_GETTEXT = 0x0D;
const uint WM_GETTEXTLENGTH = 0x0E;public static string GetControlText(IntPtr hWnd)
{
int length = SendMessage(hWnd, WM_GETTEXTLENGTH, 0, 0);StringBuilder buffer = new StringBuilder(length + 1);
SendMessage(hWnd, 0x0d, buffer.Capacity, buffer);
return buffer.ToString();
}[/cs]und der Aufruf:
[cs]List<IntPtr> childList = GetChildWindows(new IntPtr(Convert.ToInt32(textBox1.Text)));
textBox4.Text = GetControlText(childList[EnumID]);[/cs] -
also ich scheitere absolut daran das alles aufzulisten also in ne liste oder nen array zu packen....
ich habs mit nem char pointer array und vector versucht mit strings und so weiter....
das wird i-wie nix....
Edit: hier der aktuelle versuch
Code- int id = 0, slot = 0;
- vector<char*> list;
- BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM lParam)
- {
- char* buffer = new char[50];
- ::GetWindowText(hwnd, buffer , 50);
- list.push_back(buffer);
- cout << "Text: " << buffer << "\n" << endl;
- slot++;
- return TRUE;
- }
- int main(int argc, _TCHAR* argv[])
- {
- try
- {
- char *windowname = "[ISRO - iB0t] Silkroad Online B0t - http://ibotforfun.blogspot.com/";
- HWND hwnd = FindWindow(NULL, (LPCSTR)windowname);
- EnumChildWindows(hwnd, EnumChildProc, 0);
- cout << "Text: " << list[283] << "\n" << endl;
- system("PAUSE");
- return 0;
- }
-
-
Push: wusa ich habs^^
Also Fehler numero uno.... man erhält den Goldwert nur über die Methode mit SendMessage... GetWindowText workt da nicht...
Fehler 2 bei meinem doppel vector ( vector < vector <char*> > list; ) hatte ich vergessen das ich ja noch einen vector der einen char pointer als variablentyp erwartet in den ersten vector zu pushen.... somit habe ich ja einen vector slot über list[id].push_back(pointer); angesprochen der noch gar kein vector beinhaltete....so für alle jetzt hier der Code
Ich lese nun aus allen offenen ibot fenstern den Goldwert aus
C- #include <iostream>
- #include <windows.h>
- #include <tlhelp32.h>
- #include <Winbase.h>
- #include <vector>
- #include <Winuser.h>
- using namespace std;
- int id = 0, slot = 0;
- vector<vector<char*> > list;
- // Geht jedes Control vom Client durch
- BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM lParam)
- {
- int length = SendMessage(hwnd, 0x0E, 0, 0); //ermittle text länge des controls
- char* buffer = new char[length+1]; //neuen char ppointer erstellen
- SendMessage(hwnd, 0x0d, length+1, (LPARAM)buffer); //lesen des control textes
- list[id].push_back(buffer); // den text in einen doppel vector pushen
- slot++;
- return TRUE; // must return TRUE; If return is FALSE it stops the recursion
- }
- // Geht jeden client durch
- BOOL CALLBACK EnumWindow(HWND hwnd, LPARAM lParam)
- {
- char buffer[300];
- ::GetWindowText(hwnd, (LPSTR)buffer , 300); //Auslesen des Fenster titels
- if(!strcmp(buffer,"[ISRO - iB0t] Silkroad Online B0t - http://ibotforfun.blogspot.com/")){ //überprüfen des Fenster titels
- cout << "WindowName: " << buffer << endl;
- list.push_back(vector<char*>()); //vector in vector pushen ( der gepushte vector beinhaltet die control texte )
- EnumChildWindows(hwnd, EnumChildProc, 0); // Aufrufen der funktiun zum iterieren der controls
- id++;
- }
- return true;
- }
- int main(int argc, _TCHAR* argv[])
- {
- EnumWindows(EnumWindow,NULL); // aufruf der funktion zum iterieren der clients
- for(int i = 0; i < id; i++)
- cout << "Text: " << list[i][283] << "\n" << endl; //ausgabe aller controltexte mit der enumerierungs id 283 für jeden client (283 ist bei mir der goldwert)
- cout << "finish!";
- system("PAUSE");
- return 0;
- }
Ich hoffe es kann einigen helfen
MfG Sick^