Вопросик .. для наших Win32 гуру [solved]

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Deem3n®, 27 Dec 2006.

Thread Status:
Not open for further replies.
  1. Deem3n®

    Deem3n® RTFMSDN

    Joined:
    19 Sep 2005
    Messages:
    378
    Likes Received:
    153
    Reputations:
    164
    Второй день мучаюсь и не могу найти нормальное решение проблемы.

    Так вот:
    1) есть таскбар и на таскбаре кнопки
    2) возьмем к примеру кнопку окна stuff

    [​IMG]

    3) суть проблемы: нужно получить хэндл окна, которому принадлежит кнопка на таскбаре, над которой в данный момент курсор мыши

    [​IMG]

    Если у кого есть какие-нибудь идеи, скидывайте сюда, язык программирования не имеет значения.

    зы: WindowFromPoint и ChildWindowFromPoint не помогли
     
  2. a1nt

    a1nt Elder - Старейшина

    Joined:
    16 Dec 2005
    Messages:
    131
    Likes Received:
    39
    Reputations:
    25
    Ааа, ясно)
    Тогда нужно перехватывать события на кнопке. В часности wm_mousemove, wm_setcursor.
    Кстати, дло таких исследований удобно использовать утилиту WinSight32 из комплекта Delphi. Покажет все окна, события.
     
    2 people like this.
  3. _Great_

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,119
    Reputations:
    1,139
    топикстартер предлагал сэмулировать нажатие мыши и получить хендл текущего активного окна, потом вернуть окна обратно
     
  4. Deem3n®

    Deem3n® RTFMSDN

    Joined:
    19 Sep 2005
    Messages:
    378
    Likes Received:
    153
    Reputations:
    164
    =
    Этот способ не практичен.

    Имхо кнопки на таскбаре не реализованы как кнопки. Spy++ видит только ToolbarWindow32. Утром созрело возможное решение проблемы - tooltips_class32:

    [​IMG]

    Сейчас ищу возможность узнать заголовок окна, а потом уж - FindWindow :)
     
  5. Deem3n®

    Deem3n® RTFMSDN

    Joined:
    19 Sep 2005
    Messages:
    378
    Likes Received:
    153
    Reputations:
    164
    Всем спасибо, проблему решил.

    Решение:
    1) посылаю окну таскбара сообщение TB_GETBUTTON для того чтоб получить структуру TBBUTTON которая описывает кнопку на таскбаре.
    2) Хэндл окна - это первые четыре байта поля dwData структуры TB_GETBUTTON. Мля, а в мсдн про это ничего не сказано...

    Если нужны сорцы, могу выложить =)
     
    2 people like this.
  6. _Great_

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,119
    Reputations:
    1,139
    как догадался?
    зы. в мсдн вообще мало чего полезного сказано))
     
    1 person likes this.
  7. Deem3n®

    Deem3n® RTFMSDN

    Joined:
    19 Sep 2005
    Messages:
    378
    Likes Received:
    153
    Reputations:
    164
    доэкспериментировался =))
     
  8. Ch3ck

    Ch3ck Elder - Старейшина

    Joined:
    9 Jun 2006
    Messages:
    1,363
    Likes Received:
    1,184
    Reputations:
    430
    Кстати, ничё такая статейка "Дреcсированные окна".
    _http://www.xakep.ru/magazine/xa/086/116/1.asp
     
  9. Deem3n®

    Deem3n® RTFMSDN

    Joined:
    19 Sep 2005
    Messages:
    378
    Likes Received:
    153
    Reputations:
    164
    Дабы расставить все точки над ё, привожу кусок кода решающий часть данной проблемы (извините за английские комменты)

    Code:
    // find Windows Taskbar (Note: works under XP and 2k3)
    HWND hwndTaskbar = FindWindow("Shell_TrayWnd", NULL);
    hwndTaskbar = FindWindowEx(hwndTaskbar, NULL, "ReBarWindow32", NULL);
    hwndTaskbar = FindWindowEx(hwndTaskbar, NULL, "MSTaskSwWClass", NULL);
    hwndTaskbar = FindWindowEx(hwndTaskbar, NULL, "ToolbarWindow32", NULL);
    i - это индекс кнопки на таскбаре
    Code:
    // variables that needed to open taskbar (explorer) process
    DWORD taskbarProcessID;
    const int BUFFER_SIZE = 0x1000;
    
    // obtain taskbar process id - by window
    GetWindowThreadProcessId(hwndTaskbar, &taskbarProcessID);
    // open taskbar process
    HANDLE taskbarProcessHandle = OpenProcess(PROCESS_ALL_ACCESS, 0, taskbarProcessID);
    
    // variable that helds pointer to a remote buffer in taskbar process
    DWORD_PTR taskbarProcessBuffer;
    
    // allocate space for remote buffer in taskbar process
    taskbarProcessBuffer = (DWORD_PTR)VirtualAllocEx(taskbarProcessHandle, NULL, BUFFER_SIZE, MEM_COMMIT, PAGE_READWRITE);
    				
    // declare and prepare variables that will held data
    // about PRESSED button in a taskbar
    TBBUTTON tbButton;
    TBBUTTON* pTBButton = &tbButton;
    DWORD_PTR lpTBButton = (DWORD_PTR)pTBButton;
    
    // Now, retrieve information about the PRESSED button in a taskbar
    // Note: data is placed in remote buffer
    SendMessage(hwndTaskbar, TB_GETBUTTON, i, taskbarProcessBuffer);
    
    // And now, the remote data about PRESSED button is transferred to a local variable
    DWORD dwBytesRead = 0;
    ReadProcessMemory(taskbarProcessHandle, (LPVOID)taskbarProcessBuffer, (LPVOID)lpTBButton, sizeof(TBBUTTON), &dwBytesRead);
    
    // ------------------------------------------------------------------
    // Where is keeped the window handle?
    // It is in dwData field of TBBUTTON structure (the first 4 bytes) :))
    // MSDN doesn't specify anything about this!
    // ------------------------------------------------------------------
    				
    // Retrieve window handle of pressed btn
    BYTE localBuffer[BUFFER_SIZE];
    BYTE* pLocalBuffer = localBuffer;
    DWORD_PTR ipLocalBuffer = (DWORD_PTR)pLocalBuffer;
    
    // window handle
    pLocalBuffer = localBuffer;
    ipLocalBuffer = (DWORD_PTR)pLocalBuffer;
    
    // initialize remote buffer
    DWORD_PTR lpRemoteData = (DWORD_PTR)tbButton.dwData;
    	
    // and read the dwData fields of a TBBUTTON from remote process
    ReadProcessMemory(taskbarProcessHandle, (LPVOID)lpRemoteData, (LPVOID)ipLocalBuffer, sizeof(DWORD_PTR), &dwBytesRead);
    
    // obtain window handle
    // copy first 4 bytes
    HWND windowHandle;
    memcpy(&windowHandle, (void *)ipLocalBuffer, 4);
     
    1 person likes this.
  10. _Great_

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,119
    Reputations:
    1,139
    Вообщем-то это уже недокументированные возможности Gui :)
     
  11. Ch3ck

    Ch3ck Elder - Старейшина

    Joined:
    9 Jun 2006
    Messages:
    1,363
    Likes Received:
    1,184
    Reputations:
    430
    Как тут?
    _http://www.codeproject.com/dialog/windowfinder.asp
     
Thread Status:
Not open for further replies.