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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Написание небольшой программы, Помощь в написании 
:(
    Опции темы
suseway
Дата 25.2.2010, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Хочу создать небольшую программу, которая бы висела в трее, и по назначенной горячей клавише сворачивала бы активное окно на экране.
Какое средство разработки выбрать для этого и с чего начать, где загрузить? (ориентируюсь на visual c++)
PM MAIL   Вверх
chaos
Дата 25.2.2010, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


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

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



Win+D не подходит? smile 
если писать то тебе нужно
1. при старте твоего приложения запихать его в трей и убрать из таск бара
2. определить глобальный хук на клаву и привязать обработчик
3. в обработчике нужно: найти активное окно и послать ему сообщение "свернуться"

вот и весь алкоритмалгоритм
PM WWW   Вверх
borisbn
Дата 25.2.2010, 17:32 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 6
Всего: 135



user posted image
хотя это похвальное желание разобраться самому.
По поводу средств разработки посмотри в строрну QT + студия на windows или qt-creator под все (условно всеsmile другие ОС 


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
suseway
Дата 25.2.2010, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(borisbn @ 25.2.2010,  17:32)
user posted image
хотя это похвальное желание разобраться самому.
По поводу средств разработки посмотри в строрну QT + студия на windows или qt-creator под все (условно всеsmile другие ОС

Возможно ли написание такой программулины на QT в среде под Linux, но чтобы работало на Windows? Если да, то какая среда для этого нужна и с чего начать?
PM MAIL   Вверх
suseway
Дата 25.2.2010, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Пока имею вот это:

Код

#include <windows.h>
 
int APIENTRY WinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
{
 //::MessageBox(NULL, "title", "body", MB_OK); 
 HWND hWnd = ::GetForegroundWindow();
// HWND window = FindWindow(NULL, "Debug"); //задается переменная и имя окна

 if (NULL != hWnd) {
     ::ShowWindow(hWnd, SW_SHOWMINIMIZED); 
 }
 return 0;
}



При выполнении этого кода происходит сворачивание активного окна

[UPD]:: Есть вопросы:

1. Как сделать, чтобы после запуска программулины она сворачивала бы активное окно по нажатию на клавишу.
2. И еще, чтобы сама программулина висела в памяти (не закрывалась)

Это сообщение отредактировал(а) suseway - 26.2.2010, 00:12
PM MAIL   Вверх
suseway
Дата 26.2.2010, 02:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вроде бы решил пока вот так:
Код

#include <stdio.h>
#include <windows.h>

// http://msdn.microsoft.com/en-us/library/ms927178.aspx
#define VK_F6 0x75

// функция вхождений программы WinMain
int CALLBACK KeyboardProc(int nCode, DWORD wParam, DWORD lParam)
{
 HWND hWnd = ::GetForegroundWindow();
 KBDLLHOOKSTRUCT * p = (KBDLLHOOKSTRUCT*)lParam;


 switch(wParam)
  {
  case WM_KEYDOWN:
      //if (keyDown(VK_F6)) ::MessageBox(NULL, "asd", "sad", MB_OK); 

       if (p->vkCode == VK_F6)     
            if (NULL != hWnd) {
                ::ShowWindow(hWnd, SW_MINIMIZE); 
     } 

   break;

  default:
      break;
  }
 
 return 0;
}
 
int APIENTRY WinMain(HINSTANCE hInstance,
             HINSTANCE         hPrevInstance,
             LPSTR             lpCmdLine,
             int               nCmdShow)
{
 
  SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)&KeyboardProc, GetModuleHandle(NULL), 0);
  // цикл сообщений приложения
 
  MSG msg = {0};    // структура сообщения
  int iGetOk = 0;   // переменная состояния
  while ((iGetOk = GetMessage(&msg, NULL, 0, 0 )) != 0) // цикл сообщений
  {

    if (iGetOk == -1) return 3;  // если GetMessage вернул ошибку - выход
    TranslateMessage(&msg);    
    DispatchMessage(&msg);
  }
  return 0;  // возвращаем код завершения программы
}


Это сообщение отредактировал(а) suseway - 26.2.2010, 02:27
PM MAIL   Вверх
chaos
Дата 26.2.2010, 09:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


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

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



Цитата(borisbn @  25.2.2010,  14:32 Найти цитируемый пост)
По поводу средств разработки посмотри в строрну QT + студия на windows или qt-creator под все (условно все другие ОС  

оффтоп, но "нафига козе баян" ? кросс все равно не получится сделать без написания своих реализация по работе с хуками и окнами
PM WWW   Вверх
borisbn
Дата 26.2.2010, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 6
Всего: 135



chaos, 

1. 
Цитата(suseway @  25.2.2010,  15:43 Найти цитируемый пост)
Какое средство разработки выбрать для этого и с чего начать


2. 
Цитата(suseway @  25.2.2010,  15:43 Найти цитируемый пост)
создать небольшую программу, которая бы висела в трее


3. Кросс, конечно, не получится, но использовать winAPI или MFC - IMHO есть головная боль


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Alexeis
Дата 26.2.2010, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 7
Всего: 459



ИМХО хук нужен только когда нужно запретить передачу событий от клавиатуры, или изменить одни клавиши на другие. Если просто узнать о нажатии клавиш, то есть более экономичное и менее системное решение RegisterHotKey / UnregisterHotKey (глобальный хоткей)


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
chaos
Дата 26.2.2010, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


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

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



Цитата(Alexeis @  26.2.2010,  07:27 Найти цитируемый пост)
ИМХО

 smile 

"пища" для ума
Код

#include <windows.h>

int APIENTRY WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
    const int nHotKeyId = 0;
    if (NULL == ::RegisterHotKey(NULL, nHotKeyId, 0, VK_F6)) {
        ::MessageBox(NULL, "Hot key F6 is regitered!!!", "Error", MB_OK | MB_ICONERROR);
        return 0;
    }

    MSG msg;
    while (-1 != ::GetMessage(&msg, NULL, 0, 0)) {
        if (WM_HOTKEY == msg.message) {
            const HWND hWnd = ::GetForegroundWindow();
            if (hWnd)
                ::ShowWindow(hWnd, SW_MINIMIZE);
        }
    }

    ::UnregisterHotKey(NULL, nHotKeyId);

    return 0;
}


Цитата(borisbn @  26.2.2010,  07:11 Найти цитируемый пост)
но использовать winAPI или MFC - IMHO есть головная боль 

много тут головной боли?


Это сообщение отредактировал(а) chaos - 26.2.2010, 11:44
PM WWW   Вверх
suseway
Дата 2.3.2010, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Да, все работает. а реально ли сделать чтобы сворачивалось не глобально а только в определенном приложении, многооконном?
PM MAIL   Вверх
Alexeis
Дата 2.3.2010, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 7
Всего: 459



suseway, можно перечислять и дочерние окна, но не ясно когда остановиться. Представь что курсор будет над кнопкой smile . Ему что придется кнопку сворачивать?


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
suseway
Дата 2.3.2010, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Как я понимаю надо смотреть в сторону FindWindow и FindWindowEx.

А сначала получить имя класса приложения при помощи spy32?
PM MAIL   Вверх
Alexeis
Дата 2.3.2010, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 7
Всего: 459



Цитата(suseway @  2.3.2010,  18:05 Найти цитируемый пост)
Как я понимаю надо смотреть в сторону FindWindow и FindWindowEx.

  Это дает главное окно. Для навигации по дочерним нужно EnumChildWindows.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
suseway
Дата 3.3.2010, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Alexeis @ 2.3.2010,  20:51)
Цитата(suseway @  2.3.2010,  18:05 Найти цитируемый пост)
Как я понимаю надо смотреть в сторону FindWindow и FindWindowEx.

  Это дает главное окно. Для навигации по дочерним нужно EnumChildWindows.


А с помощью какой утилиты можно узнать имя класса окна?


Это сообщение отредактировал(а) suseway - 3.3.2010, 14:06
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.0848 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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