Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перемещение кнопки пуск 
:(
    Опции темы
anonym
Дата 13.3.2007, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 27.11.2006

Репутация: нет
Всего: 3



По идее, кнопка пуск должна взлететь до самого верха экрана и обратно. Функция MoveAndPlace работает для обычного окна (hwnd), но не для кнопки пуск (hButton). Что я не так делаю?

Код

#include "stdafx.h"
#include "windows.h"

BOOL RegClass(WNDPROC, LPCTSTR, UINT);
LRESULT CALLBACK MainWindowProc(HWND, UINT, WPARAM, LPARAM);

HINSTANCE hInst;

char szMainClassName[] = "MainWindowClass";

void MoveAndPlace(HWND hWnd)
{
    RECT rc;
    GetWindowRect(hWnd, &rc);
    int y;
    for (y = rc.top; y > 0; y--)
    {
        SetWindowPos(hWnd, HWND_TOPMOST, rc.left, y, rc.right - rc.left, rc.bottom - rc.top, SWP_SHOWWINDOW);        
        Sleep(1);
    }
    for (y = 0; y < rc.top; y++)
    {        
        SetWindowPos(hWnd, HWND_TOPMOST, rc.left, y, rc.right - rc.left, rc.bottom - rc.top, SWP_SHOWWINDOW);        
        Sleep(1);
    }
}


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)
{
    MSG msg;
    HWND hwnd, hTaskBar, hButton;
    hInst = hInstance;
    if (!RegClass(MainWindowProc, szMainClassName, COLOR_WINDOW))
        return FALSE;
    hwnd = CreateWindow(szMainClassName, "Приложение",
        WS_OVERLAPPEDWINDOW, 400,300,100,100,
        0, 0, hInstance, NULL);
    if (!hwnd)
        return FALSE;
    ShowWindow(hwnd, SW_SHOWNORMAL);
    hTaskBar = FindWindow("Shell_TrayWnd", NULL);
    hButton = GetWindow(hTaskBar, GW_CHILD);
    SetParent(hButton, NULL);
    MoveAndPlace(hButton);
    SetParent(hButton, hTaskBar);    
    while (GetMessage(&msg, 0, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}

BOOL RegClass(WNDPROC Proc, LPCTSTR szName, UINT brBackground)
{
    WNDCLASS wc;
    wc.style = wc.cbClsExtra = wc.cbWndExtra = 0;
    wc.lpfnWndProc = Proc;
    wc.hInstance = hInst;
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH) (brBackground + 1);
    wc.lpszMenuName = NULL;
    wc.lpszClassName = szName;
    return (RegisterClass(&wc) != 0);
}

LRESULT CALLBACK MainWindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
    case WM_DESTROY:
        {
            PostQuitMessage(0);
            return 0;
        }
    }
    return DefWindowProc(hwnd, msg, wParam, lParam);
}

PM MAIL   Вверх
586
Дата 14.3.2007, 04:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



Вызывай GetWindowRect до функции SetParent.

Код
#include "windows.h"

BOOL RegClass(WNDPROC, LPCTSTR, UINT);
LRESULT CALLBACK MainWindowProc(HWND, UINT, WPARAM, LPARAM);

HINSTANCE hInst;

char szMainClassName[] = "MainWindowClass";

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)
{
    MSG msg;
    HWND hwnd, hTaskBar, hButton;
    int y;
    RECT rc;
    hInst = hInstance;
    if (!RegClass(MainWindowProc, szMainClassName, COLOR_WINDOW))
        return FALSE;
    hwnd = CreateWindow(szMainClassName, "Приложение",
        WS_OVERLAPPEDWINDOW, 400,300,100,100,
        0, 0, hInstance, NULL);
    if (!hwnd)
        return FALSE;
    ShowWindow(hwnd, SW_SHOWNORMAL);
    //hTaskBar = FindWindow("Shell_TrayWnd", NULL);
    //hButton = GetWindow(hTaskBar, GW_CHILD);    // хотя это тоже работает...
    hTaskBar=FindWindow("Shell_TrayWnd", 0);
    hButton = FindWindowEx(hTaskBar, 0, "Button", 0);
    if(!hButton) Beep(0x1FF, 50);
    GetWindowRect(hButton, &rc);
    SetParent(hButton, NULL);
    //MoveAndPlace(hButton);

    for (y = rc.top; y > 0; y--)
    {
        SetWindowPos(hButton, HWND_TOPMOST, rc.left, y, 0, 0, SWP_SHOWWINDOW | SWP_NOSIZE);        
        Sleep(1);
    }
    for (y = 0; y < rc.top; y++)
    {        
        SetWindowPos(hButton, HWND_TOPMOST, rc.left, y, 0, 0, SWP_SHOWWINDOW | SWP_NOSIZE);        
        Sleep(1);
    }

    SetParent(hButton, hTaskBar); 
    SetWindowPos(hButton, 0, 0, 0, 0, 0, SWP_NOSIZE);  
 
    while (GetMessage(&msg, 0, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}

BOOL RegClass(WNDPROC Proc, LPCTSTR szName, UINT brBackground)
{
    WNDCLASS wc;
    wc.style = wc.cbClsExtra = wc.cbWndExtra = 0;
    wc.lpfnWndProc = Proc;
    wc.hInstance = hInst;
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH) (brBackground + 1);
    wc.lpszMenuName = NULL;
    wc.lpszClassName = szName;
    return (RegisterClass(&wc) != 0);
}

LRESULT CALLBACK MainWindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
    case WM_DESTROY:
        {
            PostQuitMessage(0);
            return 0;
        }
    }
    return DefWindowProc(hwnd, msg, wParam, lParam);
}

PM   Вверх
anonym
Дата 14.3.2007, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 27.11.2006

Репутация: нет
Всего: 3



586, огромнейшее СПАСИБО! 
Всё заработало!  smile 
PM MAIL   Вверх
szz
Дата 14.3.2007, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1289
Регистрация: 31.5.2005
Где: Moscow, Jerusalem

Репутация: 1
Всего: 33



Погодите, что за прикол? Как это кнопка пуск летает?
 Дайте попробовать, скомпиленный экзешник есть?


--------------------
PM   Вверх
586
Дата 14.3.2007, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



Цитата(szz @  14.3.2007,  14:15 Найти цитируемый пост)
скомпиленный экзешник есть?

спокойно компилируешь из командной строки

Это сообщение отредактировал(а) 586 - 14.3.2007, 17:42

Присоединённый файл ( Кол-во скачиваний: 49 )
Присоединённый файл  test.exe 3,50 Kb
PM   Вверх
szz
Дата 14.3.2007, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1289
Регистрация: 31.5.2005
Где: Moscow, Jerusalem

Репутация: 1
Всего: 33



гыгы, прикольная программа  smile 
 только где это применять?


--------------------
PM   Вверх
Earnest
Дата 15.3.2007, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Первого апреля поставишь своей девушке на компьютер... пусть порадуется...
Мне как-то раз подобным образом пошутили: мышь от меня по экрану убегала... Если бы не первое апреля, убила бы... smile 


--------------------
...
PM   Вверх
anonym
Дата 16.3.2007, 23:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 27.11.2006

Репутация: нет
Всего: 3



Так, ладно... А как вмешаться в функцию обработки сообщений для самой кнопки пуск? Чтобы, скажем, при наведении на неё мышки она двигалась или делала ещё что-нибудь?
PM MAIL   Вверх
586
Дата 17.3.2007, 01:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



Цитата(anonym @  16.3.2007,  23:35 Найти цитируемый пост)
А как вмешаться в функцию обработки сообщений для самой кнопки пуск?

Юзай хуки. Можно ещё внедрить DLL в процесс explorer.exe и сделать сабклассинг сей кнопки.
PM   Вверх
anonym
Дата 17.3.2007, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 27.11.2006

Репутация: нет
Всего: 3



586, OK, буду разбираться.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0900 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.