Button in fremdes Programm injizieren.

07/27/2011 15:16 jackicola#1
Hi,
ich versuche ein Button in ein fremdes Programm zu injizieren, hier die DLL:

Code:
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <sstream>
#include <time.h>
using namespace std;

static HWND hWnd;
static LONG p;
static int hWndI = 0;



LRESULT CALLBACK NewWndProc (HWND, UINT, WPARAM, LPARAM);

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
					 )
{
	switch (ul_reason_for_call)
	{
	case DLL_PROCESS_ATTACH:
		hWnd = FindWindowA(0, "AceDB 2.0");
		p = GetWindowLong(hWnd, GWL_WNDPROC);
		SetWindowLongA(hWnd, GWL_WNDPROC, (long)NewWndProc);

		break;
	case DLL_THREAD_ATTACH:
	case DLL_THREAD_DETACH:
	case DLL_PROCESS_DETACH:
		break;
	}
	return TRUE;
}

LRESULT CALLBACK NewWndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	static HWND			hButton_1;
	switch(message)
	{
	case WM_COMMAND:
         if (lParam == (LPARAM)hButton_1)
		 {
		return 0;
		 }
		 else
		 {
		return CallWindowProcA((WNDPROC)p,hwnd, message,wParam, lParam);
		 }
	case WM_PAINT:
		if(hWndI == 0)
		{
		hButton_1 = CreateWindowA("Button","OBJ", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE, 10, 20, 100,100,hWnd,NULL,((LPCREATESTRUCT) lParam) -> hInstance,NULL);
		hWndI++;
		UpdateWindow(hWnd);
		ShowWindow(hButton_1, SW_SHOW);
		UpdateWindow(hButton_1);
		}
		return CallWindowProcA((WNDPROC)p,hwnd, message,wParam, lParam);
	}

	return CallWindowProcA((WNDPROC)p,hwnd, message,wParam, lParam);


}
Aber der Button erscheint einfach nicht......

MFG!
07/27/2011 15:31 buFFy!#2
das kann auch garnicht gehen.

btw formatier mal deinen code, oder installier VAssistX
07/27/2011 15:55 jackicola#3
Und wieso kann es nicht gehen?
07/27/2011 16:00 buFFy!#4
schau dir deinen code an.. das macht absolut keinen sinn
07/27/2011 16:06 jackicola#5
Ich finde es toll das du mir antwortest aber deine Antworten bringen mich nicht sehr weiter :(
Könnntest du mir vllt einen Tipp geben woran es liegt?
Sry ich mache sowas zum ersten mal...
07/27/2011 16:18 buFFy!#6
du kannst einfach das hwnd vom gui nehmen und als parameter beim button erstellen übergeben. da musst du keinen wndproc und kein garnix hooken
07/27/2011 16:46 jackicola#7
Ich nehme doch hier
Code:
hWnd = FindWindowA(0, "AceDB 2.0");
das Handle vom Hauptfenster und nehme es hier
Code:
hButton_1 = CreateWindowA("Button","OBJ", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE, 10, 20, 100,100,[COLOR="Red"]hWnd[/COLOR],NULL,((LPCREATESTRUCT) lParam) -> hInstance,NULL);
wieder als Parameter.
Aber das WndProc muss ich doch hooken wenn ich selbst auf die Klicks auf die Buttons reagieren will oder?
07/27/2011 17:05 buFFy!#8
warum erstellst du den button im wndproc? schau halt ob dein code überhaupt aufgerufen wird
07/28/2011 12:28 jackicola#9
Ich habe es jetzt so :

Code:
		hWnd = FindWindowA(0, "AceDB 2.0");
		p = GetWindowLong(hWnd, GWL_WNDPROC);
		h = GetWindowLong(hWnd, GWL_HINSTANCE);
		hButton = CreateWindowA("Button","OBJ", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE, 10, 20, 100,100,hWnd,NULL,(HINSTANCE)h,NULL);
		ShowWindow(hWnd, SW_SHOW);
		ShowWindow(hButton, SW_SHOW);
		UpdateWindow(hWnd);
		UpdateWindow(hButton);
		SetWindowLongA(hWnd, GWL_WNDPROC, (long)NewWndProc);
Der Button erscheint für ne halbe Sekunde und verschwindet wieder :/
07/28/2011 17:25 MrSm!th#10
Quote:
Originally Posted by u-coRe View Post
du kannst einfach das hwnd vom gui nehmen und als parameter beim button erstellen übergeben. da musst du keinen wndproc und kein garnix hooken
Natürlich muss er hooken, wie will er sonst das Push Event abfangen?

@jack:

Dann wird vermutlich die Nachricht WM_PAINT nicht weitergeleitet, weshalb er sich nicht mehr zeichnet.
07/28/2011 21:24 jackicola#11
Daran kann es eigentlich nicht liegen, weil das neue WndProc die Nachricht an das alte WndProc weiterleitet, wenn sie nicht für mich ist:

Code:
//p:
hWnd = FindWindowA(0, "AceDB 2.0");
p = GetWindowLong(hWnd, GWL_WNDPROC);

LRESULT CALLBACK NewWndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{

	switch(message)
	{
	case WM_COMMAND:
         if (lParam == (LPARAM)hButton_of_the_axel)
		 {
		return 0;
		 }
		 else
		 {
		return CallWindowProcA((WNDPROC)p,hwnd, message,wParam, lParam);
		 }

	}
	

		return CallWindowProcA((WNDPROC)p,hwnd, message,wParam, lParam);

}