• ベストアンサー

OSとアプリとユーザの関係教えてください。

プログラミングをしていて気になったのですが、ボタンのダブルクリックしてそこに命令文をちょろちょろと書けば、ボタンがクリックされたときにその命令が実行されますが、これってどのような仕組みなのでしょうか? ユーザとOSとそのアプリの関係を教えてください。 自分なりに調べてこうかなーと思うのは、以下のとおりです。 ユーザがボタンをマウスでクリック ->OS(Windows)がそれを理解して? ->アプリに伝える ->アプリはボタンがクリックされたときのイベントのところをみにいってそこにかかれている命令文を実行する WM(ウインドウメッセージ)がどこの段階でどこからどこへ投げられているのかいまいちよくわかりませんでした。 ボタンが押されてから、イベント処理がなされるまでの詳細な流れ(メッセージのやり取りや受け手の処理)を是非、教えていただけないでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.2

1.OSが起動されて、マウスのデバイスドライバを組み込む。 2.マウスのデバイスドライバがデバイスの初期化をする時に「マウスから何かデータが来た時に起こるハードウエア割り込みは、ここで処理する」と設定する。 3.アプリが立ち上がり「メッセージループ」と呼ばれる処理ルーチンがOSに登録される。 4.OSは「Windowsの終了」が行われるまでの間「アイドル状態」になり、「アイドル状態」の時は、OSに登録されているメッセージループを実行優先度に従って順々に呼び出していく。また、呼び出したメッセージループの処理が重い(なかなか戻って来ない)と他のアプリが動けなくなるので、システムタイマーを使って定期的にタイマー割り込みを起こし、他のアプリに制御を移す事もある。 5.マウスが動かされたりボタンが押されると、ハードウエア割り込みが起こり、マウス用のデバイスドライバの中に飛んで行く。 6.マウスのデバイスドライバが、マウス変化のウインドウメッセージをメッセージキューに放り込むようにOSに要求する。 7.マウス変化のウインドウメッセージをメッセージキューに放り込むように要求されたOSは、そのメッセージがどのアプリ宛かを調べた上(マウスカーソルがどのウィンドウの上にあったかで調べる)、宛先アプリの情報を付加したウインドウメッセージをメッセージキューに入れ、マウスの割り込み処理ルーチンに戻る。 8.マウスの割り込み処理が終り、マウスのデバイスドライバから元のプログラム(つまりは、アプリのメッセージループ)に戻る。 9.アプリのメッセージループは、自分宛のウインドウメッセージがメッセージキューに無いか調べる。あったら、そのメッセージを取り出し、メッセージごとの処理に振り分ける。(画面の再描画だとか、マウスボタンが押されただとか) 10.マウスボタンが押された時に呼ばれる処理で、ボタンとかメニューとか、何の上でボタンが押されたか判定する。それがボタンコントロールの上だったら、そのボタンコントロールに登録されている、クリックイベントのルーチンを呼ぶ。 11.プログラマーが書いた、クリックイベントのルーチンが実行される。 12.イベント処理が終ったら、アプリのメッセージループに戻って来る。アプリはイベントの処理結果(ウィンドウメッセージを取り出した結果)をOSに返す。 13.OSは、イベントの処理結果に応じて、後処理を行う。例えば、処理済みのウィンドウメッセージをメッセージキューから消す、など。 14.「4.」のアプリの切り替え処理に戻り、延々と繰り返す。 なお「7.」の処理で、メッセージ内容が「マウスボタンが押された」だった場合で、かつ、宛先アプリがアクティブになってない場合は、マウスボタンを押したメッセージをキューに入れる前に、アクティブメッセージや再描画メッセージもキューに入れます。これにより「マウスで押したら画面がアクティブになる」と言う処理が行われます。

CityHunter
質問者

お礼

自分の期待していた以上のお答えありがとうございます。 細かく、わかりやすく書かれていて、自分の理解を深めることができました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

noname#25358
noname#25358
回答No.1

 ある程度の知識はおありのようですね。  おそらくは「投げる」という言葉が使われているせいで、混乱されているだけでしょう。  イベント情報(マウスがクリックされたとか)を認識するのはOSです。  このとき、アプリケーションは「OSの機能を使って」ウィンドウなどを記述しています。  なので、OSは「今どの座標にどのアプリのウィンドウがあるか」という情報を全て持っているのです。  OSがイベント情報を解釈し、現在アクティブになっているウィンドウの座標情報などから、「どのウィンドウのところでマウスがクリックされたか」などを認識し、「そのウィンドウを保持しているアプリケーション」にイベント情報を送信します。  このとき、「規定の方法で作成されたルーチンを、OSが直に起動する」という方法によってイベント情報を受け渡ししています。  よって、ウィンドウズの規定に従っていないルーチンには、OSはイベント情報を「投げる」ことはできないのです。  ウィンドウメッセージは、その「規定の方法で作られたルーチン」に対し、引数として渡されています。

CityHunter
質問者

お礼

回答ありがとうございます。 OSとアプリとユーザの関係がよくわかりました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • OSとアプリとユーザの関係教えてください。追加

    昨日は回答くださったdeagleさん、chieさんありがとうございました。ちょこっと、気になってしかたのない箇所がありまして。 >10.マウスボタンが押された時に呼ばれる処理で、ボタ>ンとかメニューとか、何の上でボタンが押されたか判定す>る。それがボタンコントロールの上だったら、そのボタン>コントロールに登録されている、クリックイベントのルー>チンを呼ぶ。 上の部分で、気になったのが、OSは、アプリがどんなボタンやどんなメニューとかなどの情報までもっているということなのでしょうか? 「どのアプリのどのボタンの上でクリックされた」というような情報までメッセージの引数に埋めてアプリ側にイベントを通知しているのでしょうか? もしそうだとすると、OSがあんなに高いのも頷けてしまいます。

  • ブラウザとCGIアプリの関係?!

    なんとなく想像はできるものの、正しいかどうか確認させていただきたく 質問させていただきます。 WEBアプリですが、例えば 「ブラウザの処理実行ボタン」クリック→「CGIアプリ」→「結果表示」 のような流れだったとして、 処理実行ボタンをクリックしてすぐにブラウザを閉じた場合、CGIアプリはどこまで処理が行えるのでしょうか? ※CGIアプリの処理はブラウザを閉じるまでの時間よりは長いとした解釈でお願いします。 CGIアプリがreturnで抜けるまで、ブラウザはなくても処理は行ってから終了。 また、 returnの前にブラウザに出力していたら、(ブラウザは無いわけで)returnの前にCGIアプリは終了してしまう。→処理途中で終わってしまうことがありえる よろしくお願いします。 わかりづらかったら、申し訳ありません。

    • ベストアンサー
    • CGI
  • エクセルVBA ユーザーフォームのボタン

    ユーザーフォームにCommandButton1があります ワークシートにもCommandButton2があります ユーザーフォーム上のCommandButton1をクリックすることで、ワークシート上のCommandButton2をクリックするという命令は作れるのでしょうか? ワークシート上のCommandButton2をクリックした後の命令は出来ているのですが、そのコードをコピーしてユーザーフォーム上のCommandButton1のコードにコピーするしかないのでしょうか? 実行ボタン(CommandButton2)をワークシートに作成したので、 ユーザーフォームで入力→ ユーザーフォーム上のボタン(CommandButton1)をクリック→ ユーザーフォームは終了→ ワークシート上の実行ボタン(CommandButton2)をクリック してくれると良いかと思いました よろしくお願いします

  • タスクバーへアプリの常駐

    アプリを起動すると、フォーム等を表示しないでタスクバーにアイコンを表示、常駐する。 そのアイコンがダブルクリックするとフォーム等を開く・・・というアプリを作っています。 API関数で、タスクバーへアイコンを追加、アイコンの削除というのはできたのですが、そのアイコンをダブルクリック(又は、右クリックでメニュー選択)したときフォームが開く、というのが出来ませんでした。 ダブルクリックしたときには、何らかのイベントが動くのでしょうか?それとも、API関数で、それを監視、実行させなくてはならないのでしょうか?

  • VBAでユーザーフォームを再表示させたい。

    ExcelのVBAでユーザーフォームを作成し、 Initializeイベントで初期化をし、コマンドボタンを クリックしたら処理を行うように作成しました。 ところがコマンドボタンによって処理を行った後、 再度Initializeイベントを呼びたいんです。。 (コンボボックスの表示を更新する処理を 含んでいるため) なんとかうまい方法はないでしょうか??

  • ユーザーフォーム動作で○○○.xlsはすでにひらいています警告文の対策

    excel2000 windowsXPを使用しています。マクロ超初心者です。 1)ワークシートにユーザーフォームA が現れます。その中のコマンドボタンをクリックすると  a b c 3個のボタンが配置されたフォームB が現れます。  フォームBの aボタンをクリックすると処理用のシートが現れ、このシートに入力複写が完了したので 戻るボタンをクリックして、前のフォームBが表示されます。 問題はここでbボタンを押すと、「○○○.xlsはすでに開いています。2重にひらくと・・・」と警告文がでます。 そこでこの警告文が出ないように もし○○○.xlsが開いていないときは、開き、開いているときは開く命令をやめてその次の行からマクロを実行しなさいというスクリプトを作りたいのですが、どう書いたらよろしいでしょうか? 2)上記フォーム正常に動作していました。フォームの中のボタンを1個だけ削除しました。再度起動したところ 「実行時エラー指定されたオブジェクトをは見つかりません」と出てフォームの修正ができません。 すでに出来たフォームの修正はどうやったらよろしいでしょうか?

  • タイマー機能について

    初めての投稿です.よろしくお願いいたします. .NET 2003のMFCを使用しています. インターフェース上にボタンを設置し,1つのボタンで, 左シングルクリックと左ダブルクリックの両方でメッセージボックスを出したいと考えています. 以前に出ていた質問に同じようなものがあり,(http://oshiete1.goo.ne.jp/qa647244.htmlを参照) タイマー機能を使えばよいということはわかったのですが,実際どうプログラミングを組んだらいいのかわかりません. OnLButtonDown内で, if(数秒以内にもう一度クリックされたら){ ダブルクリックの処理 }else{ シングルクリックの処理 } というのしか思いつかないのですが,これは無理ですよね(^_^;) ダブルクリックの処理はOnLButtonDblClk内で行なっていて… 頭がこんがらがってしまいました. ぜひアドバイスいただければと思います. よろしくお願いいたします.

  • アプリが起動しないんです…

    レッツノートでOSは98。 OSはうまく起動します。 で、ほかのアプリを起動させようとアイコンをクリックするとエラーのメッセージが出てきます。 再起動をしてくださいとかのメッセージです。 で、そこでOKを押すと不正な処理を…と言うメッセージがでます。 原因はなんなのでしょうか? ちなみにウイルスバスターを使っているのでウイルスと言うことは無いと思うのですが。 よろしくお願いします!

  • ユーザによってアプリの処理速度が異なる???

    ユーザによってアプリの処理速度が異なる??? ローカルユーザとドメインユーザで自作アプリケーションの処理速度が異なり原因が良く分からず困ってます。今までこのような事象になった事がありますか?実際に自作APをローカルユーザでは1秒以内で処理できるが、ドメインユーザでは40秒かかっています。 環境OS:Windows Vista ドメインサーバ:Active Directory ユーザ:Admin権限ありのローカルユーザ    :Admin権限なしのドメインユーザ

  • VB.NET開発(イベントプロシージャはマルチスレッドですか?)

    VB.NET開発(イベントプロシージャはマルチスレッドですか?) 以前より.NETのWindowsフォームの業務アプリ開発してますが、基本的な質問をさせて下さい。 イベントプロシージャの実行処理は、本体スレッド(実行時のスレッド)とは別のスレッドで動作しているのでしょうか。 例えば、ボタンのクリックイベントに何かしらの重い処理があったとします。このクリックイベントの処理ではボタンの制御をしていないので、イベントプロシージャの実行中は、処理中のボタンが押下可能な前提とします。この時、このボタンを3回押下して実行させると3つのスレッドが新規に作成されて実行していると考えて宜しいのでしょうか。 デリゲートやイベントに関するキーワードで検索して、いくつか資料を見たのですが、上記の疑問にぴったり合う解答がなく、質問させて頂きました。 業務アプリの開発で、今まで、あまりマルチスレッドなど意識せずやってきましたが、実は意識しなくても、マルチスレッドの開発をしていたことになるのでしょうか。 以前、VB6の開発もしておりました。 ちなみにVB6の場合も、イベントプロシージャはマルチスレッドで実行されていると考えて宜しいのでしょうか。 よろしくお願いします