Programm Handle hohlen

fabian24

Mitglied
Hallo Allerseites,

habe hier ein kleines Problem, ich möchte gerne von einem andern Programm das Handle
haben. Bisher habe ich das immer mit FindWindow() gemacht, das Problem ist das mann
immer den exakten Namen haben muss, z.B. "Hallo Gast - Microsoft Internet Explorer" dabei wird es schon etwas schwierig und deshalb wollte ich wissen, wie mann das so machen kann:

1- In meinem Programm Button anklicken
2- mit der maus über das gesuchte Programm gehen
3- Klicken
4- Handle neu = das angeklickte Programm :-)

Das Habe ich schon mal bei nem Freund gesehen, war in verbindung mit Transparenten Formen.

Danke im Voraus!
 
moin


Du kannst per GetCursorPos die Position der Maus holen und dann mit WindowFromPoint ein Handle zu dem Fenster unter dem Cursor.


mfg
umbrasaxum
 
Vielen Dank für die Hilfe!

Aber irgendwie geht das net, ich bekomme immer die Meldung :
"Zugriffsverletzung bei Addresse 0040B6E0. Lesen von Addresse 000000D3."
Was auch immer das bedeuten mag, wäre über ein Stücken fertigen Code and Weihnachten
ziemlich glücklich. :)
 
moin


Was für einen Handle willst du denn haben?
Einen aufs Fenster oder auf den Prozess?

Das hab ich mal geschrieben:
Code:
#include <windows.h>
#include <time.h>


LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int RegisterWC(WNDCLASS *, HINSTANCE *);
int InitDialog(HWND *, HINSTANCE *, int *);

const char szApp[]="Infoholer";

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrev, PSTR szCmdLine, int nCmdShow)
{
	HWND hWnd;
	MSG msg;
	WNDCLASS wc;

	RegisterWC(&wc, &hInstance);
	InitDialog(&hWnd, &hInstance, &nCmdShow);

	while(GetMessage(&msg, NULL, 0, 0))
	{
		DispatchMessage(&msg);
	}

	return (int)msg.wParam;
}


LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	static int TIMER_ID;
	static HWND edit;
	static POINT p;

	switch(message)
	{
	case WM_KEYDOWN:
		{
			GetCursorPos(&p);

			InvalidateRect(hWnd, NULL, false);
			return 0;
		}
	case WM_PAINT:
		{
			HDC hDC;
			PAINTSTRUCT ps;
            char szNummer[20];

			hDC = BeginPaint(hWnd, &ps);
			{
				HWND hZiel = WindowFromPoint(p);
				wsprintf(szNummer, "%d", (int)hZiel);
				TextOut(hDC, 2, 2, szNummer, strlen(szNummer));

			}
			EndPaint(hWnd, &ps);


			return 0;
		}
	case WM_DESTROY:
	case WM_CLOSE:
		{
			PostQuitMessage(0);

			return 0;
		}
	default:
		{
			return DefWindowProc(hWnd, message, wParam, lParam);
		}
	}

	return 0;
}

int RegisterWC(WNDCLASS *wc, HINSTANCE *hInstance)
{
	wc->cbClsExtra = 0;
	wc->cbWndExtra = 0;
	wc->hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
	wc->hCursor = LoadCursor(NULL, IDC_ARROW);
	wc->hIcon = LoadIcon(NULL, IDI_APPLICATION);
	wc->hInstance = *hInstance;
	wc->lpfnWndProc = WndProc;
	wc->lpszClassName = szApp;
	wc->lpszMenuName = NULL;
	wc->style = CS_VREDRAW | CS_HREDRAW;

	RegisterClass(wc);

	return 0;
}

int InitDialog(HWND *hWnd, HINSTANCE *hInstance, int *nCmdShow)
{
	*hWnd = CreateWindow(szApp, szApp, WS_OVERLAPPED | WS_SYSMENU,
		CW_USEDEFAULT, CW_USEDEFAULT,
		CW_USEDEFAULT, CW_USEDEFAULT,
        NULL, NULL, *hInstance, NULL);

	ShowWindow(*hWnd, *nCmdShow);
	UpdateWindow(*hWnd);

	return 0;
}


mfg
umbrasaxum
 
Nochmal vielen Dank, klappt jetzt!:-)

Ich hab noch ne Frage, wollte eigentlich neues Thema aufmachen aber bin mir nicht sicher ob das überhaupt geht, kann man eigentlich auch zu Laufzeit Zeilen
bzw. Funktionen aus führen z.B.
Ich schreibe in Edit1 "Button2->Hide();"
Drücke auf Button1 und Button2 verschwindet.
Geht sowas?
 
moin


Jo, geht.
Wenn du einen Handle auf deinen Button hast, kannst in mit ShowWindow auf false setzen und weg isser. So mach ich es immer wenn ich per WinApi programmiere.


mfg
umbrasaxum
 
Ne, so mein ich das nicht. :(

Da könnte auch in irgend einen andern Edit stehen:
. Edit1->Text = Edit2->Text.ToInt()/10;
oder
. Label1->Caption="hallo";
Dann drückt man nen Button, und dann wird das ausgeführt.
 
Nun, theoretisch geht das schon, ist nur nicht ganz einfach. Du müßtest einen Parser schreiben, der den Text im Editfeld als C- oder C++-Quelltext parst, die entsprechenden Variablennamen den Controls zuordnet und die Befehle dann ausführt. Alles in Allem ein Riesenaufwand!
 
Zurück