kostenloser Webspace werbefrei: lima-city


Eigener Button in der Taskleiste

lima-cityForumProgrammiersprachenC/C++ und D

  1. Autor dieses Themas

    funkdoobiest

    funkdoobiest hat kostenlosen Webspace.

    So hab mal ne Frage, n?mlich: Ich hab nen Button in der Taskleiste erzeugt, so weit so gut aber das Problem ist wie kann ich von diesem die Message verarbeiten? Beim Programm kommt ja nix an. Ich denk mal dass die Message an die Taskleiste geschickt wird. Wie kann ich also nen Klick oder sonst was auswerten.

    Alles mit der WINAPI

    hTask = FindWindow("Shell_TrayWnd",NULL);
    hSBtn = FindWindowEx(hTask,NULL,NULL,"Start");
    ShowWindow(hSBtn,SW_HIDE);
    hBtn = CreateWindow("Button",
    "Funk",
    WS_VISIBLE | WS_CHILD,
    0,0,57,25,
    hTask,
    (HMENU)MY_BTN,
    hInst,
    NULL);
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Erzeugt der Button keine Events, die du abfangen bzw. senden kannst?

    Also sowas wie clicked, pressed,rightclick oder was auch immer...
  4. Autor dieses Themas

    funkdoobiest

    funkdoobiest hat kostenlosen Webspace.

    Ne, beim Programm kommt nix an, kein WM_COMMAND.
    Ich denk der schickt das an die Messageverarbeitung der Taskleiste und die verarbeitet das f?r sich.
    Am besten schau ich mal mit Spy++ nach vielleicht finde ich was :/

    EDIT: So hab rausgefunden das er wirklich WM_COMMAND an die Taskleiste schickt. Wie k?nnt ich denn das auswerten oder geht das garnet.

    Beitrag ge?ndert am 23.09.2005 00:38 von funkdoobiest
  5. hast du den button in der schnellstartleiste (links)? falls ja, soviel ich weiss ist das nix anderes als eine verknuepfung. d.h. damit kannst du sowieso nur irgendwelche programme oder dateien starten/oeffnen.

    also wenn die taskleiste den event empfaengt, oeffnet sie halt was auch immer mit diesem button verbunden ist.

    in dem fall muesstest du aber auch mit rechtsklick das eigenschaften-menue aufrufen koennen?
  6. Autor dieses Themas

    funkdoobiest

    funkdoobiest hat kostenlosen Webspace.

    hmmm vielleicht versteh ich dich jetzt falsch oder du mich.

    Ich hab mit CreateWindow einen Button erstellt und hab als Parant die Taskleiste angegeben. Vorher hab ich den Startbutton ausgeblendet. Ich hab also nur nen Button der Taskleiste hinzugef?gt so als ob ich den meinem Fenster zuweisen w?rde er schickt auch ne Message aber an die Taskleiste und da weis ich nicht wie ich die Auswerten soll.

    Hier mal Bildlich:
    http://funkdoobiest.pyrokar.lima-city.de/im/task.jpeg

    Beitrag ge?ndert am 23.09.2005 01:12 von funkdoobiest
  7. Ich weis ja nicht, ich lerne grad erst winapi, wie w?rs wen du als parent einfach dein Program verwendest? Dann ek?mmst du die Messages direkt.
  8. Autor dieses Themas

    funkdoobiest

    funkdoobiest hat kostenlosen Webspace.

    ^^ Dann w?re der Button auf meinem Fenster der soll aber auf die Taskleiste. Ich muss nur halt die Message auswerten. Hab mir gedacht das man das vielleicht mit nen WindowsHook machen kann aber bin da auch net gerade weiter gekommen.

    Beitrag ge?ndert am 23.09.2005 13:28 von funkdoobiest
  9. Alles was ich jetzt sage wei? ich nicht 100%, aber ich denke, da das Windows 9x und neuer ein 32 Bit PM (Protected Mode) Systeme sind. Die Klicks da wertet der Kernel aus. Ich wei? es ja nicht sicher, da Windows nicht OpenSource ist. Deshalb sollte es eine Funktion geben, den Kernel nach den Klicks abzufragen. Ich glaube dazu brauchst du die Funktionen VirtualAlloc usw. und gleich im Speicher nachzugucken. Die Adresse kenne ich aber nicht. Da musst du schon mit einen HexEditor suchen.

    MfG Dominik

    Ich hoffe, dass ich dir helfen konnte
  10. aha, in der zwischenzeit habens auch die ganz langsamen (also ich) kapiert. sorry, ich hab wohl bisher ziemlich viel falsch verstanden.

    wie waere es denn eine Klasse zu schreiben, die von der verwendeten Button-Klasse abgleitet ist und der du eine Referenz auf dein Programm uebergibst.

    also (pseudocode):

    class meinKnopf kind von winapibutton(.....){

    void meinKnopf(anwendung *meinProg){
    this.prog = meinProg;
    winapi-code...;
    }
    }

    darin muesstest du ja dann auch den event abfangen und die entsprechende funktion in meinProg aufrufen koennen.
  11. Autor dieses Themas

    funkdoobiest

    funkdoobiest hat kostenlosen Webspace.


    aha, in der zwischenzeit habens auch die ganz langsamen (also ich) kapiert. sorry, ich hab wohl bisher ziemlich viel falsch verstanden.

    wie waere es denn eine Klasse zu schreiben, die von der verwendeten Button-Klasse abgleitet ist und der du eine Referenz auf dein Programm uebergibst.

    also (pseudocode):

    class meinKnopf kind von winapibutton(.....){

    void meinKnopf(anwendung *meinProg){
    this.prog = meinProg;
    winapi-code...;
    }
    }

    darin muesstest du ja dann auch den event abfangen und die entsprechende funktion in meinProg aufrufen koennen.


    Ja aber der Event wird immer von WindowsProc abgefangen. Bei der WNDCLASS Button kann man diese nich mal zuweisen das passiert automatisch. Also sendet er den Event an WindowsProc von der Taskleiste.
  12. 0******a

    Du musst f?r den Button (der ja auch ein Window ist) eine eigene Windowsprozedur festlegen. Das geht f?r den vordefinierten Typen "Button" nicht (so einfach). Du solltest dir daher eine eigene Window-Class (nicht zu verwechseln mit C++ Klassen) anlegen, die das Aussehen eines Button-Fensters imitiert aber eine eigene Windowsprozedur mitbringt. Schau dir dazu mal die Funktion RegisterClass() und die dazugeh?rige Struktur WNDCLASS an.

    Zu den anderen Beitr?gen:
    Es geht nicht um MFC, also kann nichts abgeleitet werden.
    Mit Protected Mode hat das ganze nichts zu tun und der Kernel verarbeitet keine User Events.
  13. Autor dieses Themas

    funkdoobiest

    funkdoobiest hat kostenlosen Webspace.

    Danke f?r die Antwort hat gefunzt.

    Problem ist also beseitigt kann also zu der Thread.

    EDIT: Hier mal der Code zur ergenzung:


    #include <windows.h>

    #define MM_MYSTARTBTN 1234

    LRESULT CALLBACK WindowProc(HWND,UINT,WPARAM,LPARAM);
    LRESULT CALLBACK TaskProc(HWND,UINT,WPARAM,LPARAM);

    HWND hStartBtn;
    //---------------------------------------------------------------------------
    WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int)
    {
    WNDCLASS wc;
    MSG msg;
    HWND hWnd;
    memset(&wc,0,sizeof(WNDCLASS));
    wc.style = CS_VREDRAW | CS_HREDRAW; /*CS_DBLCLKS nehme ich mal ganz bewusst nicht mit rein*/
    wc.lpfnWndProc = WindowProc;
    wc.hInstance = hInstance;
    wc.hbrBackground = (HBRUSH)CreateSolidBrush(GetSysColor(COLOR_3DFACE));
    wc.hIcon = LoadIcon(NULL,IDI_APPLICATION);
    wc.hCursor = LoadCursor(NULL,IDC_ARROW);
    wc.lpszClassName = "FunkWinClass";

    if(!RegisterClass(&wc))
    MessageBox(NULL,"Konnte FunkWinClass nicht registrieren.","",MB_OK|MB_ICONERROR);

    hWnd = CreateWindow("FunkWinClass","Funk",WS_VISIBLE | WS_SYSMENU,
    0,0,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,
    hInstance,NULL);

    if(!hWnd)
    MessageBox(NULL,"Konnte Fenster nicht erstellen.","",MB_OK|MB_ICONERROR);

    ShowWindow(hWnd,SW_SHOW);
    UpdateWindow(hWnd);

    while(GetMessage(&msg,NULL,0,0))
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }
    return msg.message;
    }
    ////////////////////////////////////////////////////
    ////////////////////////////////////////////////////
    LRESULT CALLBACK WindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
    {
    switch(uMsg)
    {
    case WM_CREATE:
    {
    WNDCLASS wc;
    HWND hSBtn, hTask;

    hTask = FindWindow("Shell_TrayWnd",NULL);
    hStartBtn = FindWindowEx(hTask,NULL,"Button",NULL);
    ShowWindow(hStartBtn,SW_HIDE);

    memset(&wc,0,sizeof(WNDCLASS));

    wc.style = CS_VREDRAW | CS_HREDRAW; /*CS_DBLCLKS*/
    wc.lpfnWndProc = TaskProc;
    wc.hCursor = LoadCursor(NULL,IDC_ARROW);
    wc.hbrBackground = (HBRUSH)CreateSolidBrush(GetSysColor(COLOR_3DFACE));
    wc.lpszClassName = "NewStartBtn";

    if(!RegisterClass(&wc))
    MessageBox(NULL,"Konnte NewStartBtn nicht registrieren.","",MB_OK|MB_ICONERROR);

    hSBtn = CreateWindow("NewStartBtn","",WS_VISIBLE | WS_CHILD,0,0,57,25,
    hTask,(HMENU)MM_MYSTARTBTN,NULL,NULL);

    if(!hWnd)
    MessageBox(NULL,"Konnte Fenster nicht erstellen.","",MB_OK|MB_ICONERROR);

    ShowWindow(hSBtn,SW_SHOW);
    UpdateWindow(hSBtn);
    }return 0; break;
    case WM_PAINT:
    {
    PAINTSTRUCT ps;
    HDC hDC = BeginPaint(hWnd,&ps);
    EndPaint(hWnd,&ps);
    }return 0; break;
    case WM_DESTROY:
    {
    ShowWindow(hStartBtn,SW_SHOW);
    PostQuitMessage(NULL);
    }return 0; break;
    }
    return DefWindowProc(hWnd,uMsg,wParam,lParam);
    }
    LRESULT CALLBACK TaskProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
    {
    switch(uMsg)
    {
    case WM_PAINT:
    {
    PAINTSTRUCT ps;
    HDC hDC = BeginPaint(hWnd,&ps);
    EndPaint(hWnd,&ps);
    }return 0; break;
    case WM_LBUTTONDOWN:
    {
    MessageBox(NULL,"Hallo","",0);
    }return 0; break;
    }
    return DefWindowProc(hWnd,uMsg,wParam,lParam);
    }


    Hier muss man halt beachten das, man das Zeichnen und Verhalten eines Button selber in die Hand nehmen muss. Eine andere M?glichkeit um dieses zu umgehen (ist aber unsch?n) ist es Auf dem Fenster was man in der Taskleiste erstellt hat ein Fenster des Types Button zu erstellen und nun kann man auch mit WM_COMMAND Ereignisse auswerten und muss sich nicht um die Zeichenaufgaben des Buttons k?mmern.

    Beitrag ge?ndert am 24.09.2005 15:10 von funkdoobiest
  14. 0******a

    Um den Thread zu komplettieren solltest du einen Auszug aus deinem Quellcode posten. Danke.
  15. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!