Ich suche schon seit ewigkeiten nach einem Defragmentierungsprogramm, das NTFS so defragmentiert, dass hinter jeder datei ein kleiner Freiraum gelassen wird. Ein solches Programm scheint es nicht zu geben, also dachte ich mir, ich schreib selber eins. Gibts es für so ein Projekt passende librarys oder howtos, sonstiges? Habe nämlich überhaupt keine Ahnung mit was ich so auf das dateisystem zugreifen kann, dass ich es defragmentieren und platz hinter jeder datei lassen kann.
Beiträge von djtraumwelt
-
-
-
Also, das mit den LayeredWindows hab ich "ausgecheckt" und die Uhr funktioniert soweit. Aber ein großes Problem an dieser Lösung ist, dass das clicken in die Ziffern ein clicken ins Fenster bedeutet. Das soll so nicht sein. Ich möchte die Uhr zwar angezeigt haben, aber sie nicht anklicken können, steuern über das tray (wenn ich denn auser beenden was zum steuern brauchen würde). Weil man ja alles auf seinem bildschirm anklicken können soll, müsste man durch das fenster durch clicken können. Das scheint mir aber nicht realisierbar zu sein. Falls es das doch sein sollte, dann bitte hier posten wie, dann ist die uhr auch schon fertig. Ansonsten bräuchte ich ne, vermutlich viel kompliziertere, möglichkeit, diese uhr zu realisieren.
edit: jetzt wird mir erst klar, was ihr mit durchklicken gemeint habt. ich bin halt manchmal n bissl bescheuert. jedenfalls, durch die transparenten teile kann man durchklicken, nur durch die gezeichneten teile, die ziffern, eben nicht.
edit 2: hab das problem lösen können: WS_EX_TRANSPARENT
das ergebnis gibt es unter http://www.wundervollemusik.de/Uhr.zip
-
Also, wenn ich in GetDC(0) reinzeichne, dann sehe ich davon nix. Scheint nicht so einfach zu gehen.
Wie macht man ein Teiltransparentes Fenster? (das mit dem durchklicken würde ich dann mit einem Tray lösen, welches ein TrackPopupMenu aufmacht bei rechtsclick)edit: GetWindowDC(0) liefert das gewünschte ergebnis.
-
Ich möchte gerne eine Uhr schreiben, die nicht in einem Fenster dargestellt wird, sonder transparent über den kompletten Bildschirm gezeichnet wird. Digital am liebsten, so dass dann einfach in der mitte des Bildschirms z.b. 10:39 steht. Sollte, wie der Mauszeiger funktionieren und oberhalb von allem anderen gezeichnet werden.
Mein Problem ist jetzt, dass ich überhaupt keine Ahnung von Treiberprogrammierung, falls ich ne art maustreiber-ähnlichen treiber schreiben müsste, bzw. hab ich keine Ahnung, ob ich irgendwie anders auf den Bildschirminhalt zugreifen kann, ohne gleich directx beherrschen zu müssen.
Also, wenn da jemand ne Idee hätte, wie ich das am einfachsten realisieren kann, dann bin ich dankbar für jede Hilfe. Ergebnisse werden natürlich wieder kostenlos hier veröffentlich, damit andere User, die sowas auch haben wollen, einfach downloaden können, bzw. jemand am quellcode rumbasteln kann.
-
Habs inzwischen geschafft:
CodeGetClassInfo(NULL,"EDIT",&wc); OldWndProc=wc.lpfnWndProc; wc.lpfnWndProc=EditProc; wc.hInstance=hInst; wc.lpszClassName="EDIT"; RegisterClass(&wc); hEdit=CreateWindowEx(WS_EX_CLIENTEDGE,"EDIT","",WS_CHILD | WS_BORDER | ES_AUTOHSCROLL | ES_LEFT,10,WINHGT-24,WINWID-20,24,hWnd,(HMENU)1,hInst,0); ShowWindow(hEdit,SW_SHOW); SendMessage(hEdit,EM_SETLIMITTEXT,999,0);
Code
Alles anzeigenLRESULT CALLBACK EditProc (HWND hEditProc, UINT msg, WPARAM wParam, LPARAM lParam) { if (locker==0) if (msg==WM_KEYDOWN) { if (wParam==VK_RETURN) { mess[0]=3; mess[1]=231; mpos=SendMessage(hEdit,EM_GETLINE,0,(LPARAM)mess); mess[mpos]=0; comsig=1; SendMessage(hEdit,EM_SETSEL,0,-1); SendMessage(hEdit,EM_REPLACESEL,TRUE,(LPARAM)(LPCTSTR)""); return 0; } if (wParam == VK_UP) { ofn.lStructSize=sizeof(OPENFILENAME); ofn.hwndOwner=glob; filter[0]='*'; filter[1]='.'; filter[2]='*'; filter[3]=0; filter[4]='*'; filter[5]=0; filter[6]=0; ofn.lpstrFilter=filter; ofn.lpstrCustomFilter=NULL; ofn.nFilterIndex=0; filename[0] = 0; ofn.lpstrFile=filename; ofn.nMaxFile=660; ofn.lpstrFileTitle=filetitle; ofn.nMaxFileTitle=400; ofn.lpstrInitialDir=NULL; ofn.lpstrTitle=NULL; ofn.Flags=OFN_EXPLORER; ofn.lpstrDefExt=NULL; if (GetOpenFileName(&ofn)!=0) comsig=2; return 0; } } return CallWindowProc(OldWndProc,hEditProc,msg,wParam,lParam); }
-
Hab mir n Singleline-Edit-Child-Window gemacht in das ich Text eingeben kann. Bei drücken der Enter-Taste soll der Text nun abgeschickt werden. Problem ist, dass bei drücken der Enter-Taste nix passiert. Hab mir noch n DEFPUSHBUTTON dazu gemacht, wenn ich den anklicke, dann schickt er den Text ab, das funktioniert einwandfrei. Was ich jetzt bräuchte, wär ne Idee, wie der Button automatisch gedrückt wird, wenn im Edit-Window "reingeEntert" wird, bzw. müsste ich überhaupt mal rausfinden, wann der User "reinEntert".
-
Hast du das gemacht, um Windows-Programmierung zu lernen, oder, um diese Funktion zu erhalten? Falls Letzteres zutrifft, hast du wohl das Rad neu erfunden.
Beides =) Zum einen möchte ich irgendwann mal möglichst gut programmieren können. Zum anderen habe ich diese Funktion wirklich gebraucht und nichts wirklich kostenloses oder gar open-source für windows gefunden.
Naja, warum nicht 25 Blöcke? Ist doch ne schöne Zahl =)) das reicht aus, denke ich.
-
Ok, hab den Fehler gefunden: mir hat das
gefehlt =(Hier nochmal der komplette Code, für alle die Ihr Clipboard auf 25 Speicherblöcke erweitern wollen:
C
Alles anzeigen#include <string.h> #include <windows.h> #include <shellapi.h> #define WM_SHELLNOTIFY WM_USER+5 #define WINWID 200 #define WINHGT 520 HINSTANCE hInst; LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); DWORD WINAPI checkfunc (LPVOID); HANDLE Hcheck; NOTIFYICONDATA nid = {0}; HMENU hPopup; HANDLE cdata; HWND hglob; HMENU hMenu; int endsig=0; int y; struct inhalt { char inh[10000]; } inhalt[25]; char checker[10000]; int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR CmdLine, int nCmdShow) { MSG msg; BOOL bRet; hInst=hInstance; HWND hWnd; int xwin=0; int ywin=0; char winclass[] = "Fensterklasse"; WNDCLASS wc; wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadImage (hInstance,"icon.ico",IMAGE_ICON,32,32,LR_LOADFROMFILE); wc.hCursor = LoadCursor (NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH) GetStockObject (BLACK_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = winclass; RegisterClass (&wc); xwin=GetSystemMetrics(SM_CXSCREEN); ywin=GetSystemMetrics(SM_CYSCREEN); xwin /= 2; xwin -= (WINWID / 2); ywin /= 2; ywin -= (WINHGT / 2); hWnd = CreateWindow (winclass, "WinClipper", WS_OVERLAPPEDWINDOW, xwin, ywin, WINWID, WINHGT, NULL, NULL, hInstance, NULL); hglob=hWnd; ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); while( (bRet = GetMessage(&msg, NULL, 0, 0)) != 0) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } LRESULT CALLBACK WndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { HDC hdc; HBRUSH hbr; PAINTSTRUCT ps; int xdiff, ydiff, yy; RECT crect, wrect; POINT pt; if (msg == WM_CREATE) { GetWindowRect(hWnd,&wrect); GetClientRect(hWnd,&crect); xdiff=(wrect.right - wrect.left) - crect.right; ydiff=(wrect.bottom - wrect.top) - crect.bottom; wrect.left=wrect.left - (xdiff / 2); wrect.top=wrect.top - (ydiff / 2); xdiff += WINWID; ydiff += WINHGT; MoveWindow(hWnd,wrect.left,wrect.top,xdiff,ydiff,TRUE); Hcheck=CreateThread(NULL,0,checkfunc,NULL,0,NULL); for (y=0; y < 25; y++) { sprintf(inhalt[y].inh,"---"); } } if (msg == WM_PAINT) { hdc=BeginPaint(hWnd,&ps); for (y=0; y < 25; y++) { crect.left=0; crect.top=(y*20); crect.right=WINWID; crect.bottom=(y*20)+20; hbr=GetStockObject(BLACK_BRUSH); FillRect(hdc,&crect,hbr); DeleteObject(hbr); DrawText(hdc,inhalt[y].inh,-1,&crect,DT_CENTER|DT_VCENTER); } EndPaint(hWnd,&ps); return 0; } if (msg == WM_LBUTTONDOWN) { yy=HIWORD(lParam); yy/=20; if (yy < 25) { OpenClipboard(NULL); EmptyClipboard(); HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE, (lstrlen(inhalt[yy].inh)+1)); //allocate memory as big as the text-string LPTSTR sMem = (CHAR*)GlobalLock(hMem); memcpy(sMem, inhalt[yy].inh, (lstrlen(inhalt[yy].inh)+1)); GlobalUnlock(hMem); SetClipboardData(CF_TEXT, hMem); CloseClipboard(); } } if (WM_SHELLNOTIFY && wParam==100) { if (lParam==WM_RBUTTONDOWN) { DestroyMenu(hPopup); hPopup=CreatePopupMenu(); for (y=0; y < 25; y++) { AppendMenu(hPopup,MF_STRING,1000+y,inhalt[y].inh); } AppendMenu(hPopup,MF_STRING,1026,"Beenden"); GetCursorPos(&pt); TrackPopupMenu(hPopup,TPM_RIGHTALIGN,pt.x,pt.y,0,hWnd,0); } if (lParam==WM_LBUTTONDBLCLK) { ShowWindow(hWnd,SW_RESTORE); } } if (msg == WM_COMMAND && lParam==0) { if (LOWORD(wParam)>=1000 && LOWORD(wParam)<1025) { yy=(LOWORD(wParam))-1000; OpenClipboard(NULL); EmptyClipboard(); HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE, (lstrlen(inhalt[yy].inh)+1)); //allocate memory as big as the text-string LPTSTR sMem = (CHAR*)GlobalLock(hMem); memcpy(sMem, inhalt[yy].inh, (lstrlen(inhalt[yy].inh)+1)); GlobalUnlock(hMem); SetClipboardData(CF_TEXT, hMem); CloseClipboard(); } if (LOWORD(wParam)==1026) { DestroyWindow(hWnd); } } if (msg == WM_SIZE && wParam==SIZE_MINIMIZED) { hPopup=CreatePopupMenu(); for (y=0; y < 25; y++) { AppendMenu(hPopup,MF_STRING,1000+y,inhalt[y].inh); } AppendMenu(hPopup,MF_STRING,1026,"Beenden"); ShowWindow(hWnd, SW_HIDE); nid.cbSize=sizeof(NOTIFYICONDATA); nid.hWnd=hWnd; nid.uID=100; sprintf(nid.szTip,"Hallo"); nid.uFlags=NIF_ICON+NIF_MESSAGE; nid.uCallbackMessage=WM_SHELLNOTIFY; nid.hIcon=LoadImage (hInst,"icon.ico",IMAGE_ICON,32,32,LR_LOADFROMFILE); Shell_NotifyIcon(NIM_ADD, &nid); return 0; } if (msg == WM_CLOSE) { Shell_NotifyIcon(NIM_DELETE,&nid); endsig=1; } if (msg == WM_DESTROY) { PostQuitMessage(0); return 0; } return DefWindowProc(hWnd,msg,wParam,lParam); } DWORD WINAPI checkfunc (LPVOID var) { while(endsig==0) { OpenClipboard(hglob); cdata=GetClipboardData(CF_TEXT); CloseClipboard(); sprintf(checker,"%s",cdata); if (strcmp(checker,inhalt[0].inh)==0) { Sleep(250); } else { for (y=24; y > 0; y--) { sprintf(inhalt[y].inh,"%s",inhalt[y-1].inh); } sprintf(inhalt[0].inh,"%s",checker); InvalidateRect(hglob,NULL,FALSE); } } ExitThread(0); return 0; }
-
Das Tray-Icon verschwindet immer dann auf die von dir beschriebene Art und Weise, wenn der Prozess nicht mehr lebt, der es erzeugt hat.
Das hilft mir nicht weiter, der Prozess lebt nämlich noch. Hab das Tray mal Testweise in der Winmain schon erstellt und der Prozess lebt auf jeden fall, zumindest zeigt der Taskmanager mir die Tray.exe noch an, nur das Tray an sich ist weg.
-
ja, was weiß ich, warum die schrift rot ist, hab nichts anders gemacht, als bei anderen foren.
-
C
Alles anzeigen[COLOR=red][COLOR=Black]#include <string.h> #include <windows.h> #include <shellapi.h> #define WM_SHELLNOTIFY WM_USER+5 HINSTANCE hInst; LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); HWND glob; NOTIFYICONDATA nid = {0}; HMENU hPopup; char winclass[] = "Lutschendes Prog"; int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR CmdLine, int nCmdShow) { MSG msg; BOOL bRet; hInst=hInstance; HWND hWnd; int xwin=0; int ywin=0; WNDCLASS wc; wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon (NULL, IDI_APPLICATION); wc.hCursor = LoadCursor (NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH) GetStockObject (BLACK_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = winclass; RegisterClass (&wc); xwin=GetSystemMetrics(SM_CXSCREEN); ywin=GetSystemMetrics(SM_CYSCREEN); xwin /= 2; xwin -= 200; //400 Breit ywin /= 2; ywin -= 50; //100 Hoch hWnd = CreateWindow (winclass, "WinClipper", WS_OVERLAPPEDWINDOW, xwin, ywin, 400, 100, NULL, NULL, hInstance, NULL); glob=hWnd; ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); while( (bRet = GetMessage(&msg, NULL, 0, 0)) != 0) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } LRESULT CALLBACK WndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; HBRUSH hbr; RECT crect, wrect; POINT pt; if (msg == WM_SIZE && wParam==SIZE_MINIMIZED) { hPopup=CreatePopupMenu(); AppendMenu(hPopup,MF_STRING,1000,"&Close Server"); ShowWindow(hWnd, SW_HIDE); nid.cbSize=sizeof(NOTIFYICONDATA); nid.uID=100; sprintf(nid.szTip,"Hallo"); nid.uFlags=NIF_ICON; nid.hIcon=LoadIcon (NULL, IDI_APPLICATION); Shell_NotifyIcon(NIM_ADD, &nid); } if (msg == WM_DESTROY) { PostQuitMessage(0); return 0; } return DefWindowProc(hWnd,msg,wParam,lParam); }[/COLOR] [/COLOR]
das Fenster verschwindet, wie es soll, das Tray erscheint, wie es soll, und verschwindet dann, sobald man mit der Maus drüber geht, was es nicht soll. Warum verschindet das Tray?