Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Можно ли без создания оконной процедуры такое сделать?  (Прочитано 7886 раз)
0 Пользователей и 1 Гость смотрят эту тему.
monrus
Опытный

ru
Offline Offline

« : 20-12-2007 13:20 » new

Можно ли без создания оконной процедуры такое сделать?
Если да то дайте пример Улыбаюсь

* APIHide.pas (2.07 Кб - загружено 865 раз.)
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 20-12-2007 13:34 » 

monrus, а почему не воспользоваться VCL/CLX ? И что надо устроить? Обработку клавиш?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
zubr
Гость
« Ответ #2 : 20-12-2007 17:22 » 

Конечно можно + в твоем примере есть ошибка, в результате он не корректно работает.
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
    procedure WMHotkey(var msg:TMessage); message WM_HOTKEY;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;



implementation

{$R *.dfm}

const
  id_hide = 101;
  id_show = 102;
  id_exit = 103;

procedure TForm1.FormCreate(Sender: TObject);
begin
 RegisterHotKey(Handle, id_hide, 0 {MOD_SHIFT}, VK_F8);
 RegisterHotKey(Handle, id_show, 0, VK_F9);
 RegisterHotKey(Handle, id_exit, 0, VK_F10);
end;

procedure TForm1.WMHotkey(var msg:TMessage);
var
  d, h:cardinal;
begin
 d := FindWindow('Progman', nil);
 h := FindWindow('Shell_TrayWnd', nil);
 If msg.WParam=id_hide then
 begin
  ShowWindow(d, SW_HIDE);
  ShowWindow(h, SW_HIDE);
 end
 else
 if msg.WParam = id_exit then
 begin
  ShowWindow(d, SW_SHOW);
  ShowWindow(h, SW_SHOW);
  Close;
 end
 else
 begin
  ShowWindow(d, SW_SHOW);
  ShowWindow(h, SW_SHOW);
 end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
 UnRegisterHotKey(Handle, id_hide);
 UnRegisterHotKey(Handle, id_show);
 UnRegisterHotKey(Handle, id_exit);
end;

end.
Обрати внимание на код в твоем примере:
Код:
if wpr = id_hide then
    begin
      d := FindWindow('Progman', nil);
      ShowWindow(d, SW_HIDE);
      h := FindWindow('Shell_TrayWnd', nil);
      ShowWindow(h, SW_HIDE);
    end
Сравни с моим, а теперь подумай в чем ошибка.
Записан
monrus
Опытный

ru
Offline Offline

« Ответ #3 : 21-12-2007 02:53 » 

В принципе мой код работает.
У меня есть и на VCL, просто хотел на апи. Но думаю именно без создания оконных процедур. Типа сервиса что ли. А у zubra, также создается окно. Оно ж в данной проге совсем не нужно.
ВОт и прошу сказать как это можно без создания оконной процедуры для самой проги замутить Улыбаюсь
без этого
monrus, begin
  instance := GetModuleHandle(nil);

  WindowClass.style := CS_HRedraw or CS_VRedraw;
  WindowClass.Lpfnwndproc := @windowproc;
  WindowClass.Hinstance := Instance;
  WindowClass.HbrBackground := color_btnface;
  WindowClass.LpszClassName := 'DX';
//WindowClass.Hcursor:=LoadCursor(0,IDC_ARROW);

  RegisterClass(WindowClass);

  Handle := CreateWindowEx(0, 'DX', '', ws_overlappedwindow, 1, 1, 200, 200, 0, 0, Instance, nil);
« Последнее редактирование: 21-12-2007 02:58 от monrus » Записан
zubr
Гость
« Ответ #4 : 21-12-2007 05:10 » 

monrus, так так бы и написал, можно ли сделать подобное без окна.
Вот можно сделать что то типа:
Код:
program Hot;
uses
  windows,messages;
var
    msg:TMsg;

begin
 if RegisterHotKey(0,1, MOD_ALT+MOD_CONTROL,
               $5A            // virtual-key code  'Z'
        ) then
        while(GetMessage(Msg,0,0,0)) do
        begin
            TranslateMessage(Msg);
            if Msg.message = WM_HOTKEY then
            //какой то код
            then  PostQuitMessage(0);
            DefWindowProc( 0, Msg.Message, Msg.wParam, Msg.lParam ) ;
        end;
end.

Записан
zubr
Гость
« Ответ #5 : 21-12-2007 10:45 » 

Вот код, применительно к твоему примеру:
Код:
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  windows,
  messages;

var
  msg:TMsg;
  h, d: HWND;

const
  id_hide = 101;
  id_show = 102;
  id_exit = 103;


begin
 RegisterHotKey(0, id_hide, 0 {MOD_SHIFT}, VK_F8);
 RegisterHotKey(0, id_show, 0, VK_F9);
 RegisterHotKey(0, id_exit, 0, VK_F10);
 while(GetMessage(Msg,0,0,0)) do
 begin
  d := FindWindow('Progman', nil);
  h := FindWindow('Shell_TrayWnd', nil);
  TranslateMessage(Msg);
  if Msg.message = WM_HOTKEY then
  begin
   If Msg.wParam=id_hide then
   begin
    ShowWindow(d, SW_HIDE);
    ShowWindow(h, SW_HIDE);
   end
   else
   If Msg.wParam=id_exit then
   begin
    ShowWindow(d, SW_SHOW);
    ShowWindow(h, SW_SHOW);
    break;
   end
   else
   begin
    ShowWindow(d, SW_SHOW);
    ShowWindow(h, SW_SHOW);
   end;
  end;
  DefWindowProc( 0, Msg.Message, Msg.wParam, Msg.lParam ) ;
 end;
 UnRegisterHotKey(0, id_hide);
 UnRegisterHotKey(0, id_show);
 UnRegisterHotKey(0, id_exit);
 PostQuitMessage(0);
end.
Записан
monrus
Опытный

ru
Offline Offline

« Ответ #6 : 22-12-2007 18:13 » 

Неужели все так просто Улыбаюсь Спасибо большое!!!
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines