Очень часто в программе необходимо сделать перемещение окна за её поле. Или же если вы сделали скин к приложению, натянув на него рисунок и спрятав рамку окна. Сделать это можно так:
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;
Обратите внимание, что в начале вызывается стандартный обработчик. Кроме перемещения формы, добавьте возможность завершения программы в виде кнопки или пункта меню, так как пользователь не сможет закрыть ее при помощи заголовка окна или системного меню.
Показаны сообщения с ярлыком winapi. Показать все сообщения
Показаны сообщения с ярлыком winapi. Показать все сообщения
воскресенье, 12 октября 2008 г.
вторник, 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 - просто стандартное название, изменить его можно на любое другое.:)
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 - просто стандартное название, изменить его можно на любое другое.:)
Ярлыки:
API,
callback,
delphi,
enumwindows,
enumwindowsproc,
winapi
воскресенье, 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!!!');
Как можнодогадаться из названия данных 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!!!');
Ярлыки:
API,
delphi,
getwindowtext,
setwindowtext,
winapi
Подписаться на:
Сообщения (Atom)