Einzelne Steuerelemente auf Desktop
-
Doch das geht!
Das habe ich schon gemacht!
Du kannst dir zum Beispiel ein Edit auf das Desktop setzen.Ich guck mal schnell ob ichs noch hinbekomm...
cu para
-
Doch, so geht das, aber wenn du nur den geposteten Code ausführst, verschwindet das Fenster sofort wieder, weil dein Programm zu Ende ist.
-
dankeschön...
-
#include <windows.h> #include <stdio.h> int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int nCmdShow) { HWND hDesktop = NULL; HWND hEdit = NULL; hDesktop = GetDesktopWindow(); hEdit = CreateWindow("edit","DESKTOP", WS_CHILD | WS_VISIBLE,200,200,100,20,hDesktop, NULL,hInstance,NULL); UpdateWindow(hEdit); UpdateWindow(hDesktop); printf("Beenden mit q+Enter\r\n"); while(getchar()!='q'){}; return 0; }
-
@paranoiac.org: hast du das mal ausprobiert? printf und getchar in einer Windows-Anwendung? Das meinst du nicht ernst, oder?
-
nagut, aber ich denke mit dem grundsatz könnte er recht haben, werd es mal wagen... dank an euch
-
Original erstellt von D@niel $chumann:
**@paranoiac.org: hast du das mal ausprobiert? printf und getchar in einer Windows-Anwendung? Das meinst du nicht ernst, oder?:D**
[edit]Hab dein Post falsch verstanden, sorry[/edit]
Danke!
cu para
[ Dieser Beitrag wurde am 08.01.2003 um 17:39 Uhr von paranoiac.org editiert. ]
-
Aber ausprobiert habe ich es natürlich. Es ging.
Naja, was will man mehr? Ich wollte auch nur schnell was zum "testen".also, hoffentlich nicht so schlimm!
cu para
-
Also, das Control wird erstellt, nur kann damit nichts anfangen. Mir scheint als müsste ich es in eine FensterProc einbauen, um damit was machen zu können.
-
Original erstellt von BiGFusel:
Also, das Control wird erstellt, nur kann damit nichts anfangen. Mir scheint als müsste ich es in eine FensterProc einbauen, um damit was machen zu können.Stimmt. Ohne Messages ist nix mit was damit machen!
cu para
-
Also trotz aller Versuche etwas Text hineinzuschreiben, funktioniert es auch in einer WndProc nicht. Unter Win98SE, wie ich es verwende, wird es gemalt, aber Eingaben kann ich nicht machen, es scheint als ob es abgestürzt ist. Ich versteh das nicht, denn das Desktop-Window ist doch in der Hinsicht ein Fenster wie jedes andere auch, in das ich Child-Windows einbauen kann, oder ?
-
Ich hab's jetzt mal probiert, hab WinXP:
#include <windows.h> // ------------------------------------------------------------------------------------------- // const int EDIT_ID = 5000; const int TIMER_ID = 123321; // ------------------------------------------------------------------------------------------- // // Die WndProc LRESULT CALLBACK MainProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam); // ------------------------------------------------------------------------------------------- // HINSTANCE hInst; // Globaler Zugriffspunkt auf die Instanz // ------------------------------------------------------------------------------------------- // int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd) { hInst = hInstance; // Hauptfensterklasse registrieren WNDCLASSEX main; main.cbSize = sizeof(main); main.cbClsExtra = 0; main.cbWndExtra = 0; main.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); main.hCursor = LoadCursor(0,IDC_ARROW); main.hIcon = LoadIcon(0,IDI_APPLICATION); main.hIconSm = LoadIcon(0,IDI_APPLICATION); main.hInstance = hInst; main.lpfnWndProc = MainProc; main.lpszClassName = TEXT("deskchild_class"); main.lpszMenuName = 0; main.style = CS_VREDRAW | CS_HREDRAW; if(!RegisterClassEx(&main)) { return 0; } // Hauptfenster erstellen HWND hMainWnd = CreateWindowEx(0,TEXT("deskchild_class"),TEXT("DeskChild"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,300,300,0,0,hInst,0); ShowWindow(hMainWnd,SW_HIDE); UpdateWindow(hMainWnd); // Hauptschleife MSG msgMain; while(GetMessage(&msgMain,0,0,0)) { TranslateMessage(&msgMain); DispatchMessage(&msgMain); } return msgMain.wParam; } // ------------------------------------------------------------------------------------------- // LRESULT CALLBACK MainProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam) { static HWND hDesktop; static HWND hEdit; switch(uMsg) { case WM_TIMER: { SYSTEMTIME st; TCHAR szBuf[256]; GetLocalTime(&st); GetTimeFormat(LOCALE_USER_DEFAULT,0,&st,0,szBuf,(sizeof(szBuf) / sizeof(szBuf[0]))); SendMessage(hEdit,WM_SETTEXT,0,(LPARAM) szBuf); return 0; } break; case WM_CREATE: { SetTimer(hWnd,TIMER_ID,1000,0); hDesktop = GetDesktopWindow(); hEdit = CreateWindowEx(0,TEXT("edit"),0,WS_CHILD | WS_VISIBLE | ES_LEFT,5,5,100,16,hDesktop,(HMENU) EDIT_ID,hInst,0); return 0; } break; case WM_DESTROY: { KillTimer(hWnd,TIMER_ID); PostQuitMessage(0); return 0; } break; } return DefWindowProc(hWnd,uMsg,wParam,lParam); }
Funktioniert super!
cya
-
Is echt ne Möglichkeit, mit dem unsichtbaren Fenster, prima Idee...danke
-
Mir ist gar nix anderes eingefallen, als ein unsichtbares Fenster... wie krieg ich es sonst hin, dass es die ganze Zeit läuft?
cya
-
Es gibt ja eine Reihe von Extra DesktopFunktionen der API aber da schien mir keine richtig zu passen !
-
Original erstellt von MagiC Creator:
... wie krieg ich es sonst hin, dass es die ganze Zeit läuft?Öhm, SubClassing und ne Message-Loop.
-
Kannste nicht mal nen Beispiel-Code posten ?
-
Denkste, ich setz mich jetzt daran für dich?! Ich hab auch noch andere Sachens zu tun!
-
-
Na gut. Aber nur für dich.
#include <windows.h> //--------------------------------------------------------------------------- // Global Variables HWND g_hEdit; HWND g_hParent; FARPROC g_OldWndProc; //--------------------------------------------------------------------------- // Function Prototypes HWND FindListView32(); LRESULT CALLBACK NewWndProc(HWND, UINT, WPARAM, LPARAM); //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR, int) { g_hParent = FindListView32(); if(!g_hParent) return -1; // Create Edit LONG style = WS_VISIBLE|WS_CHILD; LONG ex_style = WS_EX_CLIENTEDGE; g_hEdit = CreateWindowEx(ex_style, "EDIT", NULL, style, 100, 400, 180, 21, g_hParent, NULL, hInstance, NULL); SendMessage(g_hEdit, WM_SETFONT, (WPARAM)GetStockObject(DEFAULT_GUI_FONT), MAKELPARAM(TRUE, 0)); // Subclass Edit g_OldWndProc = (FARPROC)GetWindowLong(g_hEdit, GWL_WNDPROC); SetWindowLong(g_hEdit, GWL_WNDPROC, (LONG)NewWndProc); // Message Loop MSG msg; while(GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } //--------------------------------------------------------------------------- LRESULT CALLBACK NewWndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { switch(iMsg) { case WM_KEYUP: if((int)wParam == VK_RETURN) SendMessage(g_hEdit, WM_CLOSE, 0, 0); break; case WM_DESTROY: PostQuitMessage(0); break; } return CallWindowProc(g_OldWndProc, hwnd, iMsg, wParam, lParam); } //--------------------------------------------------------------------------- HWND FindListView32() { HWND hwnd = FindWindow(NULL, "Program Manager"); if(hwnd) { hwnd = FindWindowEx(hwnd, NULL, "SHELLDLL_DefView", ""); if(hwnd) hwnd = FindWindowEx(hwnd, NULL, "SysListView32", ""); } return hwnd; }
Müsste man sicher noch was dran rummodeln. Aber so in der Art halt.
[ Dieser Beitrag wurde am 09.01.2003 um 01:37 Uhr von WebFritzi editiert. ]