C++ Bildschirmtastatur +SetFocus +TopMost

tacky

Grünschnabel
C++ Bildschirmtastatur +SetFocus (gelöst) +TopMost (gelöst) +Neues Problem mit Button

Guten Tag, ich poste hier das erste mal und hoffe dadurch ein wenig Hilfe zu bekommen.
Ich programmiere noch nicht so wirklich lange mit C++ und deswegen fällt es mir bis jetzt doch noch schwer.

Ich sitze hier beim Praktikum und soll eine Bildschirmtastatur wie die von Windows programmieren. Das ganze in C++ und mit Microsoft Visual C++ 6.0. Alles ohne MFC oder so. Das meiste hab ich schon hinbekommen nur jetzt kommts zum eigendlichen Problem.

Wenn ich eine Taste auf meiner Tastatur drücke muss der Focus danach ja auf das Window davor gesetzt werden, sonst würde er ja versuchen im eigenen Fenster du schreiben.
Oder der Focus müsste einfach immer weg von meiner Tastatur sein.

Ich hab mir gedacht, dass wenn ich den Focus verliere der Case:
Code:
case WM_SETFOCUS:
		{
			...
                        return 0;
		}
aufgerufen wird.
Aber dann müsste ich irgendwie wieder den Focus auf das letzte Window setzen.

Meine Tastatur müsste ja ausserdem immer im Vordergrund sein, aber ich weiß da auch nicht wie ich das mit dem WS_EX_TOPMOST machen soll. Zur Zeit hab ich das einfach in die Properties von meinem Window gesetzt:

Code:
wndclass.style = WS_EX_TOPMOST | CS_HREDRAW | CS_VREDRAW | WS_OVERLAPPED;

Nur da passiert auch nichts.

Ich weiß das ich nicht so wirklich der super Programmierer bin, aber ich hab schon alles mögliche gegoogelt und hier auch schon mit der Suchfunktion rumgeguckt, aber so wirklich bringt mich das auch nicht weiter.
Ich hoffe mir kann da wer ein paar Tipps geben die mir weiterhelfen.

Edit: Okay das mit dem TopMost hab ich jetzt hinbekommen. Jetzt darf das Window nur nicht mehr einen Focus bekommen!
 
Zuletzt bearbeitet:
Hallo!

So wirklich lange beschäftige ich mich auch noch nicht mit der WindowsProgrammierung, aber um mal auf dein WS_EX_TOPMOST-Problem einzugehen :

Die ersten beiden Buchstaben stehen für Window Style, und müssen in der CreateWindowEx() Funktion eingesetzt werden, und nicht wie bei dir in den Class Styles der FensterKlasse.

Und ganz sicher bin ich mir nicht, aber könntest du nicht bei jedem TastenDruck mit SendMessage(HWND,UINT,WPARAM,LPARAM) die WM_SETFOCUS Nachricht an das Ausgabefenster senden?

Hoffe ich konnte ein bisschen helfen,

MfG
 
Das mit dem TopMost hab ich ja schon gestern gelöst bekommen.
Wie du schon sagtest mit CreateWindowEx
Code:
hwnd = CreateWindowEx (WS_EX_TOPMOST, szAppName, TEXT ("On-Screen Keyboard"),
		WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 780, 270, NULL, NULL, hInstance, NULL);

Und wegen dem SetFocus:
Das Problem dabei ist, dass das Ausgabefenster sich nicht in meinem Window befindet. Also es soll ja die VKs in ein beliebiges Fenster schreiben, das ich offen hab. So wie die Bildschirmtastatur von Windows halt. Ich hab gestern auch mal meinen Cheffe hier gefragt, der eigendlich ziemlich fit in C++ ist, aber der weiß da auch nicht weiter.
Vll gibts ja hier wen, der mir einen Ansatz geben kann.
 
Immer noch keiner ne Ahnung auf die Frage? Es muss doch irgendwie möglich sein, nen HWND von dem zuletzt aktiven Fenster zu bekommen!
 
Okay das Problem hab ich dann doch gelöst!
Mit...
Code:
HWND wnd = ::GetForegroundWindow();
	if(IsWindow(wnd))
	{
		if(wnd != hwnd)
		{
			if(gFocus != wnd)
			{
				if(IsWindow(gFocus))
				{
					AttachThreadInput(
						GetWindowThreadProcessId(hwnd,NULL),
						GetWindowThreadProcessId(gFocus,NULL),
						FALSE);
				}

				gFocus = wnd;
				AttachThreadInput(
					GetWindowThreadProcessId(hwnd,NULL),
					GetWindowThreadProcessId(gFocus,NULL),
					TRUE);
			}
		}
	}

... bekomme ich das Handel des anderen Fensters und mit...

Code:
void ReleaseFocus(HWND wnd, HWND gFocus)
{
	if(IsWindow(wnd))
	{
		HWND wnd = ::GetForegroundWindow();
		if(IsWindow(wnd))
		{
			if(wnd == gFocus)
			{
				return;
			}
		}
		::SetForegroundWindow(gFocus);
		::SetFocus(gFocus);
	}
}

... das ich vor jedem Tastendruck aktiviere setze ich dann das Focus.
(Falls noch wer das Problem hat)

Jetzt hab ich aber ein neues Problem!
Wenn ich auf die Buttons klicke flackert es immer einmal kurz, weil er beim klicken den Focus auf den Button setzt und dann direkt wieder auf das Window in dem ich schreibe.
Um dies zu unterbinden hab ich einfach mal der msg:
Code:
case WM_MOUSEACTIVATE:
als return Value
Code:
return MA_NOACTIVATE;
eingegeben.
Klappt wunderbar, aber auch nur wenn ich auf mein Parent Window klicke. Sobald ich auf einer meiner Buttons klicke, bekommt er diese Message nicht.
Ich würde gerne wissen, wie ich es hinbekomme, dass erst die Message von meinen Buttons ankommt und dann die vom Parent Window.
 
Ich habe noch eine kleine Frage...
In meinem Window benutzte ich Windows mit dem Style BS_PUSHBUTTON
Kann ich das irgendwie hinkriegen das die Buttons gedrückt bleiben, wenn ich einmal draufdrücke?
 
Zurück