Показаны сообщения с ярлыком winapi. Показать все сообщения
Показаны сообщения с ярлыком winapi. Показать все сообщения

воскресенье, 12 октября 2008 г.

WinAPI: Perform. Отправка сообщений форме.

Очень часто в программе необходимо сделать перемещение окна за её поле. Или же если вы сделали скин к приложению, натянув на него рисунок и спрятав рамку окна. Сделать это можно так:

procedure TForm1.MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
const SC_DragMove = $F012; 
begin 
ReleaseCapture; 
perform(WM_SysCommand, SC_DragMove, 0); 
end;


Этот код применим ко всем визуальным компонентам Delphi. Он позволяет перемешать НЕ ОБЪЕКТ по форме, а форму в целом по рабочему столу. Ниже ещё один способ.

Данный метод описан в технической информации (TI) Borland и бывает полезен если ваша форма не имеет области заголовка (синей полосы вверху). У такой формы свойство BorderStyle установлено равным bsNone. Самый просотой способ заключается в том, чтобы заставить Windows думать, что произошло нажатие в области заголовка окна, когда происходит нажатие в клиентской области. Это можно сделать, добавив собственный обработчик события wm_NCHitTest. Откройте модуль вашей формы и добавьте следующее описание в разделе private:

procedure TForm1.WMNCHitTest(var M: TWMNCHitTest);


Процедура названа так в соответствии с соглашениями об именах в Windows, но вы можете изменить название, если вам захочется. Теперь в разделе implementation опишем код процедуры.

procedure TForm1.WMNCHitTest(var M: TWMNCHitTest);
begin
inherited;
//вызываем стандартный обработчик 
if M.Result = htClient then 
M.Result := htCaption;
end;



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

вторник, 23 сентября 2008 г.

WinAPI: Enumwindows

Представьте, что вам надо свернуть все окна на рабочем столе, или передать всем запущеным программам и открытым окнам несколько сообщений... Или просто получить список всех запущеных программ и открытых окон. Как это сделать? Самый простой способ - использовать API Enumwindows, синтаксис которой представлен ниже.

function EnumWindows(EnumFunc: TFarProc, lParam: Longint): Bool;

Значит тепеть о том, чем собственно эта функция заниматся... Она перечисляет все окна на рабочем столе(видимые и невидимые, включая системный трэй), к каждому из которых применяется функция, имя которой указывается в первом параметре. Теперь давайте рассмотрим функцию, которая будет выполнять необходимые нам операции над перечисляемыми программами и окнами. Синтаксис таков:

function EnumWindowsProc(h:hwnd): Bool; stdcall;

Вот это минимальная необходимая фунция для работы с перечисляемыми окнами. Так как функция Enumwindows перечисляет handle всех окон и приложений, то главным и необходимым входящим параметром Enumwindowsproc будет handle получаемого объекта. (Хрень какую то пишу...). Ниже приведен кусок программы, которая сворачивает все возможные (видимые и невидимые, включая системный трэй) окна и программы в пуск. Не рекомендую так делать.

function enumwindowsproc(h:hwnd):bool; stdcall;
begin
closewindow(h);
enumwindowsproc:=true
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
enumwindows(@enumwindowsproc,0);
end;


Теперь посмотрим на главные особенности использования данной функции... Первое, не забудте, что в Enumwindows, на месте первого параметра вы указываете не описанную функцию, а адрес на нее (@). Второе, чтоб enumwindowsproc выполнялась ко всем окнам, необходимо в конце её тела сделать Callback, тоесть написать enumwindowsproc:=true. И третье, enumwindowsproc - просто стандартное название, изменить его можно на любое другое.:)

воскресенье, 21 сентября 2008 г.

WinAPI: Set/get windowtext

Set/get windowtext

Как можнодогадаться из названия данных API функций, речь пойдет о работе с заголовками различных окон и программ. С ними можно сделать что угодно. При том, используя API, работать можно с заголовками "чужих" окон и программ. Дот две функции, первая из которых служит для получения заголовка окна, а вторая для установления нового.

function GetWindowText(Wnd: HWnd; Str: PChar; MaxCount: Integer): Integer;

function SetWindowText(Wnd: HWnd; Str: PChar);


Рассмотрим первую функцию. Первый параметр указывает на окно, заголовок которой будет определяться. Второй - переменную, в которую будет заноситься заголовок. Третья определяет размер буфера, выделенного под заголовок. Приведенный ниже код позволяет определить заголовок программы.

procedure TForm1.Button1Click(Sender: TObject);
var r:array[1..255]of char;
begin
getwindowtext(application.Handle,@r,255);
showmessage(r)
end;


А вот так можно получать заголовки скрытых приложений и окон (по классам):

procedure TForm1.Button1Click(Sender: TObject);
var r:array[1..255]of char;
begin
getwindowtext(findwindow('progman',nil),@r,255);
showmessage(r)
end;


С помощью второй функции можно устанавливать свои заголовки. Рассмотрим её параметры. Первый указывает на окно, заголовок которого будем менять, а второй собственно и есть новый заголовок. Вот так можно менять у своей программы..

setwindowtext(application.Handle,'Hello!!!');

Чтоб поменять заголовок у формы, пиши.....

setwindowtext(Handle,'Hello!!!');

Чтоб у других программ и окон пиши...

setwindowtext(findwindow(nil,'Мой компьютер'),'Hello!!!');