![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Программирование многооконного приложения для WinCE
Татьяна © (2008-01-28 14:26:00)1.Как сделать, чтобы все формы выходили во весь экран. Как сделать, чтобы форму нельзя было переместить на экране, потянув за верхнюю границу.Свойства DefaultSize и DefaultPosition = true у всех форм.
2. Как сделать, чтобы приложение не запускалось дважды.JustOne не получилось использовать, выходит ошибка при компилировании.
(2008-05-04 19:13:00) [1]Удалено модератором
(2008-02-28 04:02:00) [2]Удалено модератором
Compiler (2008-02-08 14:31:00) [3]> Yury Sidorov (08.02.08 14:12) [7]
+
SetForegroundWindow(FindWindow(nil, 'Заголовок программы'));
Yury Sidorov (2008-02-08 14:12:00) [4]
> Я всегда использую
> CreateSemaphore(nil, 0, 1, 'My_Program');
> if (GetLastError = ERROR_ALREADY_EXISTS) then begin
> Halt(0);
> end;
>
> P.S. Вариантов масса
Это просто защита от повторного запуска. А вопрос стоял в активации уже работающего приложение при попытке повторного запуска...
Compiler (2008-02-08 13:47:00) [5]Я всегда использую
CreateSemaphore(nil, 0, 1, 'My_Program');
if (GetLastError = ERROR_ALREADY_EXISTS) then begin
Halt(0);
end;
P.S. Вариантов масса
YuriyM (2008-02-08 13:42:00) [6]
> В KOL-CE есть JustOneActivate для ограничения запуска одного
> экземпляра приложения и активации его при запуске второго
> экземпляра.
Большое спасибо за ответ. Еще у меня получилось так:
procedure TestApp;
var
W: HWND;
begin
W:= FindWindow(nil, 'Proba');
if W<>0 then
begin
SetForegroundWindow(W);
Halt(1);
end;
end;
Yury Sidorov (2008-02-08 13:31:00) [7]Кстати, это уже обсуждалось тут:
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1196634700&n=10
Yury Sidorov (2008-02-08 13:29:00) [8]В KOL-CE есть JustOneActivate для ограничения запуска одного экземпляра приложения и активации его при запуске второго экземпляра.
YuriyM (2008-02-08 13:10:00) [9]Подскажите что делаю не так. Код процедуры вставил в Unit1, в секции initialization прописал TestApp. При запуске каждый раз новая копия.
procedure TestApp;
const AppClass = {$ifndef wince}'obj_App'{$else}'App'{$endif};
var W: HWND;
ClassName, S: KOLString;
begin
SetLength(S, 100);
SetLength(ClassName, 100);
W:= FindWindow(AppClass, nil);
ShowMessage(Int2Str(W)); // Поставил для проверки W=0
while W <> 0 do begin
GetClassName(W, PKOLChar(ClassName), 100);
GetWindowText(W, PKOLChar(S), 100);
if PKOLChar(ClassName) = AppClass then begin
PKOLChar(S)[9]:= #0;
if PKOLChar(S) = 'mdvReader' then Break;
end;
W:= GetWindow(W, GW_HWNDNEXT);
end;
if W <> 0 then begin
SetForegroundWindow(W);
Halt(1);
end;
end;
mdw (2008-01-28 15:52:00) [10]
> 1.Как сделать, чтобы все формы выходили во весь экран.
Имеется в виду, чтобы не было верхней и нижней строк Windows (кнопка пуск и строка меню)? Если да, поищите по форуму отвечал недавно.
> Как сделать, чтобы форму нельзя было переместить на экране,
> потянув за верхнюю границу.Свойства DefaultSize и DefaultPosition
> = true у всех форм.
DefaultSize и DefaultPosition = true должно быть достаточно.
> 2. Как сделать, чтобы приложение не запускалось дважды.JustOne
> не получилось использовать, выходит ошибка при компилировании.
У меня примерно так:
При старте приложения:
initialization
TestApp;
procedure TestApp;
const AppClass = {$ifndef wince}'obj_App'{$else}'App'{$endif};
var W: HWND;
ClassName, S: KOLString;
CopyData: TCopyDataStruct;
begin
SetLength(S, 100);
SetLength(ClassName, 100);
W:= FindWindow(AppClass, nil);
while W <> 0 do begin
GetClassName(W, PKOLChar(ClassName), 100);
GetWindowText(W, PKOLChar(S), 100);
if PKOLChar(ClassName) = AppClass then begin
PKOLChar(S)[9]:= #0;
if PKOLChar(S) = 'mdvReader' then Break;
end;
W:= GetWindow(W, GW_HWNDNEXT);
end;
if W <> 0 then begin
S:= ParamStr(1);
CopyData.dwData:= 09121972;
if ParamCount > 0 then begin
CopyData.cbData:= (Length(S)+1)*SizeOf(KOLChar);
CopyData.lpData:= PKOLChar(S);
end
else begin
CopyData.cbData:= 0;
CopyData.lpData:= nil;
end;
SendMessage(W, WM_COPYDATA, 0, Integer(@CopyData));
Halt(1);
end;
end;
У Апплета проверяем:
function TTextOutForm.KOLAppletMessage(var Msg: tagMSG; var Rslt: Integer): Boolean;
begin
Result:= False;
case Msg.message of
WM_COPYDATA:
if PCopyDataStruct(Msg.lParam).dwData = 09121972 then begin
SetForegroundWindow(Applet.Handle);
Applet.ProcessMessages;
if PCopyDataStruct(Msg.lParam).lpData <> nil then OpenFile(PKOLChar(PCopyDataStruct(Msg.lParam).lpData));
Result:= True;
end;
end;
end;
Это для случая если нужно еще и данные передать приложению.
А если просто активизировать, то в
procedure TestApp;
....
if W <> 0 then begin
//вместо
{ S:= ParamStr(1);
CopyData.dwData:= 09121972;
if ParamCount > 0 then begin
CopyData.cbData:= (Length(S)+1)*SizeOf(KOLChar);
CopyData.lpData:= PKOLChar(S);
end
else begin
CopyData.cbData:= 0;
CopyData.lpData:= nil;
end;
SendMessage(W, WM_COPYDATA, 0, Integer(@CopyData));
}
//пишем
SetForegroundWindow(Ц);
Halt(1);
end;
....
end;