Как стать автором
Обновить

Google Keep Desktop App для Windows за 10 минут

Здравствуйте, уважаемые участники Хабрахабра.

Наверняка среди вас есть люди, которые пользуются таким замечательным сервисом как Google Keep. Это развивающийся аналог Evernote, но только от Google. На данный момент есть версия для Android, веб-приложение а ля Gmail и расширение для Chrome. Всё вроде бы хорошо, но нет десктопного приложения.
Лично я привык на рабочем столе в Windows 7 (на втором мониторе) иметь что-то типа постоянно открытого блокнота, в котором можно делать себе напоминания, которые всегда доступны и мозолят глаза (чтобы не забыть). Это стандартный гаджет Windows 7. Как бы было хорошо синхронизировать содержимого такого блокнота с веб-сервисом, в данном случае, Google Keep.
Ну и зачем ждать разработчиков Google? К тому же, не факт, что они разродятся таким приложением.

Открываем Delphi 7. Делаем по вкусу размеры формы, перетаскиваем компонент TWebBrowser и пишем примерно следующее:



unit google_keep_app;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, OleCtrls, SHDocVw, ActiveX, StdCtrls;

type
  TForm1 = class(TForm)
    WebBrowser1: TWebBrowser;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    FOleInPlaceActiveObject: IOleInPlaceActiveObject;
    procedure MsgHandler(var Msg: TMsg; var Handled: Boolean);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
SetWindowLong(Application.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW); 
OleInitialize(nil);
Application.OnMessage := MsgHandler;
Form1.Left:=1920;
Form1.Top:=590;
Form1.Height:=460;
WebBrowser1.Navigate('https://drive.google.com/keep');
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  OleUninitialize;
  FOleInPlaceActiveObject := nil;
end;

procedure TForm1.MsgHandler(var Msg: TMsg; var Handled: Boolean);
var
  iOIPAO: IOleInPlaceActiveObject;
  Dispatch: IDispatch;
begin
  if not Assigned(WebBrowser1) then
  begin
    Handled := False;
    Exit;
  end;
  Handled := (IsDialogMessage(WebBrowser1.Handle, Msg) = True);
  if (Handled) and (not WebBrowser1.Busy) then
  begin
    if FOleInPlaceActiveObject = nil then
    begin
      Dispatch := WebBrowser1.Application;
      if Dispatch <> nil then
      begin
        Dispatch.QueryInterface(IOleInPlaceActiveObject, iOIPAO);
        if iOIPAO <> nil then
          FOleInPlaceActiveObject := iOIPAO;
      end;
    end;
    if FOleInPlaceActiveObject <> nil then
      if ((Msg.message = WM_KEYDOWN) or (Msg.message = WM_KEYUP)) and
        ((Msg.wParam = VK_BACK) or (Msg.wParam = VK_LEFT) or (Msg.wParam = VK_RIGHT)
        or (Msg.wParam = VK_UP) or (Msg.wParam = VK_DOWN)) then begin
        exit;
        end;
        FOleInPlaceActiveObject.TranslateAccelerator(Msg);
  end;
 end;
end.


Координаты окна:
Form1.Left:=1920;
Form1.Top:=590;
Form1.Height:=460;

Я указал исходя из работы в своем окружении (2 монитора) и желаемого положения окна на 2-ом мониторе.
Вы можете указать любые свои координаты. При желании программу можно снабдить INI-шником с нужными настройками.
В свойствах формы указал тип невидимой рамки.
SetWindowLong(Application.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW); — для скрытия значка приложения из панели задач.
Процедура TForm1.MsgHandle необходима для корректной обработки нажатия клавиши Enter во время редактирования текста в окне Google Keep.
Еще одно замечание. Для упрощения работы желательно, чтобы в браузере была активная сессия с тем же GMail.
Тогда Google Keep в новом окне автоматически подхватит куки сессии.
Ярлык EXE-шника помещаем в автозагрузку и всё готово.

ps: Я не являюсь профессиональным программистом. Просто любитель.
pps: Расширение для Chrome лично мне не подошло, разместить его как гаджет Windows 7 на отдельном рабочем столе с независимой работой от браузера не получилось…
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.