Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.02.13;
Скачать: [xml.tar.bz2];

Вниз

Получение хендла приложения если нет формы   Найти похожие ветки 

 
tradakad   (2004-12-21 17:32) [0]

есть приложение но внем нет ни единой формы . как получить хендл приложения?


 
Digitman ©   (2004-12-21 17:54) [1]


> хендл приложения


у приложения не было, нет и не будет никаких "хэндлов".
ВНЕ зависимости от наличия каких-то там "форм" или отсутствия оных.


 
tradakad   (2004-12-21 18:00) [2]

ну а как же Application.handle ?


 
Digitman ©   (2004-12-21 18:06) [3]


> ну а как же Application.handle ?


а именно так !

приведи-ка фрагмент текста из офиц.док-ции, где утверждается, что сие св-во возвращает именно значение "хэгдла приложения ...


 
Digitman ©   (2004-12-21 18:14) [4]

и не приведешь, и не парься ..

ибо там сказано

Provides access to the window handle of the main form (window) of the application.

прочувствуй разницу между хэндлом окна (окна как реально фигурирующего объекта ОС) и хэндлом черт-те что именуемого тобой приложением (а НЕТ таких объектов в ОС ! есть ПРОЦЕСС, ОКНО, и т.д. и т.п.)


 
tradakad   (2004-12-22 09:38) [5]

тогда извиняюсь за безграмотный и неправильно сформулированный вопрос. попробую сказать иначе. есть малькая форма, на ней 2 кнопки одна из них добавляет значок в трей другая прибивает его ооттуда (я просто пробую сам добавлять для этого использую кнопки) вот так

function AddTrayIcon( hWindow:THandle; ID:Cardinal;
ICON:hicon; CallbackMessage:Cardinal; Tip:String) : Boolean;
var
NID : TNotifyIconData;
begin

FillChar( NID, SizeOf( TNotifyIconData ), 0 );

with NID do begin
cbSize := SizeOf(NID);
Wnd:= hWindow;
uID:= ID;
uFlags:= NIF_MESSAGE or NIF_ICON or NIF_TIP;
uCallbackMessage := CallbackMessage;
hIcon:= Icon;
if Length( Tip ) > 63 then SetLength( Tip, 63 );
StrPCopy( szTip, Tip );
end;
Result := Shell_NotifyIcon( NIM_ADD, @NID );
end;

function RemoveTrayIcon( hWindow:THandle; ID:Cardinal;
ICON:hicon; CallbackMessage:Cardinal; Tip:String) : Boolean;
var
NID : TNotifyIconData;
begin

FillChar( NID, SizeOf( TNotifyIconData ), 0 );

with NID do begin
cbSize := SizeOf(NID);
Wnd:= hWindow;
uID:= ID;
uFlags:= NIF_MESSAGE or NIF_ICON or NIF_TIP;
uCallbackMessage := CallbackMessage;
hIcon:= Icon;
if Length( Tip ) > 63 then SetLength( Tip, 63 );
StrPCopy( szTip, Tip );
end;
Result := Shell_NotifyIcon( NIM_DELETE, @NID );
end;

и это работает. одна кнопка добавляет - другая удаляет. но я хочу приложение БЕЗ ФОРМЫ и чтобы при загрузке иконка добавлялась и удалялась при закрытии программы. я думал RemoveTrayIcon( но тут нужен хендл а я не знаю что там писать , )
Извняюсь сразу за возможно вновь возникшую путаницу..


 
vladislav80   (2004-12-22 10:09) [6]

Создай скрытое окно


 
tradakad   (2004-12-22 10:50) [7]

тогда екзешник всеравно вырастает до 350 кб. потому что подлючается forms.. неподходит


 
Digitman ©   (2004-12-22 11:14) [8]


> екзешник всеравно вырастает до 350 кб. потому что подлючается
> forms


ничего там не "подключается", если ты сам не подключишь.. не выдумывай

окно можно создать и безо всяких Forms - непосредственно вызывая нужные ф-ции WinAPI

для уменьшения же размера "екзешника" пересобери свой проект с опцией Build With Run-Time packages - будет тебе "маленький екзешник


 
tradakad   (2004-12-22 11:41) [9]

ну как вариант-написать окно на чистом winApi. согласен. тогда оно буквально кб весит.но суть в том - что если окна нет то и хендла его нет? как тогда вызывать  Shell_NotifyIcon?


 
7E81h ©   (2004-12-22 11:58) [10]

Пример на C с использованием WinAPI.
Создает невидимое окно, добавляет иконку в трей,
по нажатию правой кнопкой мыши на иконку в трее завершает приложение.


char  szWinName[] = "MyWindow";
DWORD  dwMainID;
WNDCLASS wcl;
HWND  hwnd;
MSG  msg;
NOTIFYICONDATA IconData;

// Обработчик сообщений окна программы
LRESULT CALLBACK WindowFunc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
               // Сообщение от нажатия правой кнопки мыши на иконку в трее
 case WM_USER + 1:
  switch(lParam)
  {
   case WM_RBUTTONDOWN:
    ::PostMessage(hwnd, WM_DESTROY, 0, 0);
    break;
  }
  break;
 case WM_DESTROY:
  PostQuitMessage(0);
  break;
 default:
  return DefWindowProc(hwnd, message, wParam, lParam);
}
return 0;
}

int APIENTRY WinMain(HINSTANCE hInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR     lpCmdLine,
                    int       nCmdShow)
{

// Регистрация класса окна
wcl.hInstance = hInstance;
wcl.lpszClassName = szWinName;
wcl.lpfnWndProc = WindowFunc;
wcl.style = 0;
wcl.hIcon = ::LoadIcon(NULL, IDI_APPLICATION);
wcl.hCursor = ::LoadCursor(NULL, IDC_ARROW);
wcl.lpszMenuName = NULL;
wcl.cbClsExtra = 0;
wcl.cbWndExtra = 0;
wcl.hbrBackground = (HBRUSH)::GetStockObject(WHITE_BRUSH);
if(!RegisterClass(&wcl))
 return 0;

// Создание окна
hwnd = ::CreateWindow(szWinName,
 "Мое окно",
 WS_OVERLAPPEDWINDOW,
 CW_USEDEFAULT,
 CW_USEDEFAULT,
 CW_USEDEFAULT,
 CW_USEDEFAULT,
 HWND_DESKTOP,
 NULL,
 hInstance,
 NULL);

       // Параметр SW_HIDE - окно не отображается
::ShowWindow(hwnd, SW_HIDE);
::UpdateWindow(hwnd);

// Добавление в трей
IconData.cbSize = sizeof(IconData);
IconData.hIcon = wcl.hIcon;
IconData.hWnd = hwnd;
::lstrcpy(IconData.szTip, "Мое окно в трее");
IconData.uCallbackMessage = WM_USER + 1;
IconData.uFlags = NIF_MESSAGE + NIF_ICON + NIF_TIP;
IconData.uID = 100;
::Shell_NotifyIcon( NIM_ADD, &IconData);

// Цикл обработки сообщений
while(::GetMessage(&msg, NULL, 0, 0))
{
 ::TranslateMessage(&msg);
 ::DispatchMessage(&msg);
}

// Удаление из трея
::Shell_NotifyIcon(NIM_DELETE, &IconData);

return msg.wParam;
}


 
Digitman ©   (2004-12-22 12:20) [11]


> если окна нет то и хендла его нет?


разумеется нет


> как тогда вызывать  Shell_NotifyIcon?


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


 
tradakad   (2004-12-22 15:23) [12]

ну впринципе все ясно. создается клас, регистрируется и т.д.и т.п, но признаться не оень понял это

// Обработчик сообщений окна программы
LRESULT CALLBACK WindowFunc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)

а именно когда этот обработчик вызывается и как? подозреваю что собака запрыта в callback но точно не пойму. объясните плз.


 
Digitman ©   (2004-12-22 15:29) [13]


> когда этот обработчик вызывается и как?


зависит от того, создано ли окно-приемник сообщения в том же трэде что и тред-передатчик сообщения


 
tradakad   (2004-12-22 15:40) [14]

мда.. почти все понятно, а именно что такое окно-приемник - понятно а что такое трэд - нет к сожаленью...


 
Digitman ©   (2004-12-22 15:58) [15]

трэд - это кодовый поток.

при создании процесса системой создается основной трэд
осн.трэд в ходе работы может создавать доп.трэды (см. Ф-цию CreateThread)

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

см. тему станд.справки
Writing multi-threaded applications


 
GrayFace ©   (2004-12-22 17:07) [16]

Digitman ©   (22.12.04 15:58) [15]
трэд - это кодовый поток.

Вряд ли это определение можно понять, не зная заранее, что такое Thread.
Обычными словами: Трэд - это такой объект, у него есть 1 функция, вызывающаяся параллельно с другими потоками.  У приложения может быть много трэдов. В каждом может быть 1 окно.


 
Digitman ©   (2004-12-22 17:16) [17]


> GrayFace ©   (22.12.04 17:07) [16]


> Вряд ли это определение можно понять, не зная заранее, что
> такое Thread.


а для это существует справка делфи и справка-первоисточник  производителя ОС


> Трэд - это такой объект


желательно бы упомянуть, что трэд является объектом ОС.


> У приложения может быть много трэдов


у приложения не может быть никаких трэдов.
трэды могут быть у процесса, а не у приложения.


> В каждом может быть 1 окно


неверно.

трэд вправе вообще не создавать никаких окон, равно так же как и вправе создать столько окон, сколько позволят системные ресурсы (глобальные и ассоциированные с данным процессом)


 
tradakad   (2004-12-22 17:19) [18]

а . это о потоках. тогда понятно. спсибо что объяснили правда с потоками я еще не сталкивался.. как то и руки не дошли и читал что чем болше потоков тем... вобщем нужно поосторожнее с их использованием, вот потому то я пока туда и не лез...


 
Digitman ©   (2004-12-22 17:26) [19]


> читал что чем болше потоков тем..


тем ЧТО ? любопытно было бы услышать ...


> вобщем нужно поосторожнее с их использованием


разумеется.
программирование мультитрэдовых аппликаций в общем случае будет ощутимо сложней, нежели однотрэдовых.
впрочем, "сложность" чего-либо одного познается в сравнении со сложностью чего-либо иного


 
Digitman ©   (2004-12-22 17:31) [20]


> tradakad   (22.12.04 17:19) [18]
> а . это о потоках


поосторожней с этим термином - "поток".

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

а есть еще "файбер" (в досл. переводе - "волокно", в "вольном" переводе - кодовый поток, диспетчеризация которого полностью подконтрольна программисту)


 
tradakad   (2004-12-23 09:56) [21]

немного понятно.
> тем ЧТО ? любопытно было бы услышать ...
вот из хелпа-

Если вы имеете более одного процессора, это замечательно. В противном случае множество параллельных потоков не ускоряет работу приложения, поскольку в отдельно взятый промежуток времени возможно выполнение только одного потока. Кроме того, чем больше у вас потоков, тем больше нагрузки на систему, потраченной на переключение между ними. Если ваш проект имеет более двух постоянно работающих потоков, то такая мультизадачность не сделает программу быстрее. Обратное же утверждение истинно!


 
Digitman ©   (2004-12-23 10:57) [22]


> tradakad   (23.12.04 09:56) [21]


во-первых, о каком-то ускорении или замедлении работы программы речи в твоем вопросе не идет, как не идет речи о доп.трэде вообще

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

в-третьих, у тебя уже есть один трэд (основной), именно в его контексте стартует твое приложение, от этого факта никуда не денешься .. если в ходе работы своего алгоритма ты не создаешь доп.трэдов, но создаешь окна, это означает что все этими окнами владеет осн.трэд, следовательно, и оконные их callback-ф-ции будут вызываться в контексте того же трэда

когда система обнаружит мышиное событие в зоне иконки, она поставит в очередь сообщений трэда-владельца сообщение с кодом uCallbackMessage о произошедшем событии, указав что адресатом сообщения является окно, указанное тобой при формировании структуры NOTIFYICONDATA

как только в каком-то месте программы очередное сообщение будет выбрано тредом из очереди (см. ф-ции GetMessage, PeekMessage) и диспетчеризовано (см. ф-цию DispatchMessage), тут же, прямо в ходе выполнения ф-ции диспетчеризации, будет непосредственно вызвана та самая callback-ф-ция, которая была указана тобой в кач-ве оконной ф-ции при создании окна-адресата, хэндл которого ты указал в структуре NOTIFYICONDATA и который будет фигурировать в параметре hWnd вызыванной оконной callback-ф-ции.


 
tradakad   (2004-12-23 11:06) [23]

для Digitman:
во-первых, о каком-то ускорении или замедлении работы программы речи в твоем вопросе не идет, как не идет речи о доп.трэде вообще
- ну естественно , я просто ответил на Ваш вопрос - > тем ЧТО ? любопытно было бы услышать ...
а по сути я вот сделал dpr файл и он добавляет иконку в трей, но никакого окна я не создавал и все вроде работает.
вот.
program Project1;

uses
 windows,shellapi,messages;

{$R *.res}
var
 hInst : HWND;
 NID: TNotifyIconData;

begin
hInst:=GetModuleHandle(nil);
NID.uID :=0;
NID.Wnd := hInst;
NID.uCallbackMessage :=WM_USER;
NID.hIcon := LoadIcon(HINSTANCE,"ICON1");
NID.szTip := "Winhider";
NID.uFlags :=NIF_ICON or NIF_MESSAGE or NIF_TIP;
NID.cbSize :=sizeof(NID);
Shell_NotifyIcon(NIM_ADD,@NID);

end.


 
tradakad   (2004-12-23 11:07) [24]

для Digitman:
во-первых, о каком-то ускорении или замедлении работы программы речи в твоем вопросе не идет, как не идет речи о доп.трэде вообще
- ну естественно , я просто ответил на Ваш вопрос - > тем ЧТО ? любопытно было бы услышать ...
а по сути я вот сделал dpr файл и он добавляет иконку в трей, но никакого окна я не создавал и все вроде работает.
вот.
program Project1;

uses
 windows,shellapi,messages;

{$R *.res}
var
 hInst : HWND;
 NID: TNotifyIconData;

begin
hInst:=GetModuleHandle(nil);
NID.uID :=0;
NID.Wnd := hInst;
NID.uCallbackMessage :=WM_USER;
NID.hIcon := LoadIcon(HINSTANCE,"ICON1");
NID.szTip := "Winhider";
NID.uFlags :=NIF_ICON or NIF_MESSAGE or NIF_TIP;
NID.cbSize :=sizeof(NID);
Shell_NotifyIcon(NIM_ADD,@NID);

end.


 
Digitman ©   (2004-12-23 12:38) [25]


> никакого окна я не создавал и все вроде работает


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


> hInst:=GetModuleHandle(nil);
> NID.Wnd := hInst;


это неверно.
хэндл модуля (тот что ты фактически передаешь) и хэндл окна (тот что ты должен был передать на самом деле) - совершенно разные "вещи", эти хэндлы отражают совершенно разные сущности и контексты.


 
tradakad   (2004-12-24 12:45) [26]

да. я понял это уже.  пришел  к тому что создаю окно и дальше с ним оперирую... по этому вопросу все. спасибо всем!



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.02.13;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.048 c
8-1098816272
Arty
2004-10-26 22:44
2005.02.13
Поворот выводимой картинки


1-1106729873
NightStranger
2005-01-26 11:57
2005.02.13
Окно запроса


3-1105950301
RavenD
2005-01-17 11:25
2005.02.13
Lookup из TQuery?


11-1089804973
TrayIcon
2004-07-14 15:36
2005.02.13
TrayIcon + Menu


1-1106641669
Weare
2005-01-25 11:27
2005.02.13
Как сделать сообщение, которое появляется поверх всех окон.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский