いつもお世話になっております
自分で作ったソフトに常駐機能を付けたくて
http://www.borland.co.jp/qanda/delphi/d0009410.html
上記ページに書かれた内容をそのまま使用した所、作成したソフトの自動で
サイトにログインするという機能が動作しなくなってしまいました
(常駐無しの場合きちんと動作しています)
と言っても動作しなくなるのは
「起動直後から常駐を初めてその後一度も常駐を解除しなかった時」
つまり一度でもウィンドウを表示させてから常駐し直すと動作します
また、OnCreateイベントの
>procedure TForm1.FormCreate(Sender: TObject);
>begin
> Application.ShowMainForm := False;
> MoveToTaskTray;
>end;
「Application.ShowMainForm := False;」という行を削除し、
ウィンドウが表示されてからButton1をクリックして常駐させた場合には
問題なく動作します(上と言ってる事同じ?)
自動でサイトにログインする機能には TWebBrowserのOnDocumentComplete
イベントを使っていて、
procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
var
hIE:HWND;
tmp:OleVariant;
begin
if LogingIn = true then
begin
hIE := FindWindowEx(WebBrowser1.Handle,0,'Shell DocObject View',nil);
hIE := FindWindowEx(hIE,0,'Internet Explorer_Server',nil);
if hIE = 0 then exit;
//ID記述
SendMessage(hIE,WM_LBUTTONDOWN,0,MakeLParam(X1,Y1));
SendMessage(hIE,WM_LBUTTONUP,0,MakeLParam(X1,Y1));
Edit1.SelectAll;
Edit1.CopyToClipboard;
WebBrowser1.ExecWB(OLECMDID_PASTE,OLECMDEXECOPT_DONTPROMPTUSER,tmp,tmp);
//Pass記述
SendMessage(hIE,WM_LBUTTONDOWN,0,MakeLParam(X2,Y2));
SendMessage(hIE,WM_LBUTTONUP,0,MakeLParam(X2,Y2));
Edit2.SelectAll;
Edit2.CopyToClipboard;
WebBrowser1.ExecWB(OLECMDID_PASTE,OLECMDEXECOPT_DONTPROMPTUSER,tmp,tmp);
//ログインボタンを押す
SendMessage(hIE,WM_LBUTTONDOWN,0,MakeLParam(X3,Y3));
SendMessage(hIE,WM_LBUTTONUP,0,MakeLParam(X3,Y3));
LogingIn := false;
end;
end;
としているのですが、最初から常駐させていてウィンドウを一度も表示していない場合
常駐を解除した直後にこのイベントが実行されているようです。
よって別のURLを開いた後に常駐を解除してもログインできません
(Timerを使用して複数のサイトに順番にログイン)
上手く質問をまとめる事ができず、わかり難い文章になってしましました(汗
とりあえずお聞きしたいのは、
・何故一度常駐を解除(ウィンドウを表示)する必要があるのか
・ウィンドウを表示せずに一度は表示したのと同じ結果を得る方法
です
>・何故一度常駐を解除(ウィンドウを表示)する必要があるのか
おそらくウィンドハンドルが作成されていない為でしょう。
>・ウィンドウを表示せずに一度は表示したのと同じ結果を得る方法
FormCreate の最後にでも
WebBrowser1.HandleNeeded;
を実行してみてはいかがでしょうか。
ツイート | ![]() |