サンプルソースは C 言語としてコンパイルしてください。 C++ としてコンパイルした場合、エラーが発生する場合があります ※誤ったプログラムを実行すると、Windowsが不安定になることもあります 重要なシステム上では実験を行わないで下さい この講座は、C言語を熟知していることが前提です
自らが起動した他のアプリケーションを終了させるには CreateProcess()で起動させプロセスハンドルを保持し 終了はTerminateProcess()で簡単に終了させる事が出来ます。 しかしこのAPIは有無を言わさずプロセスを強制終了させるので危険です。 出来る限り使わないほうが良いでしょう。 では安全に終了させるにはどうしたら良いかと言うと 起動したアプリケーション自らが終了する様に仕向けます。 方法としてはウィンドウハンドルを取得しWM_CLOSEを送るのが一般的です。 只、プロセスハンドルから直接ウィンドウハンドルを取得するAPI等は存在しません。 そこでウィンドウハンドルからウィンドウを作成したプロセスのIDを調られる GetWindowThreadProcessId()というAPIを使用します。 つまり、全てのウィンドウハンドルを取得し、1つずつ作成したプロセスIDが
A Blog of Keima Sawamura, male from Taiwan. Programming, Life, and Others.
Windowsでウインドウを利用するプログラムでは、WinMain()関数を実装しますが、 WinMain()関数を実装すると、printfやcoutなどで標準出力(コンソール)に出力 する内容が表示されない為、手軽にprintfデバッグが行いにくくなります。そこで コンソールアプリケーションのままで、ウインドウを表示を行う手順について説明 します。 ウインドウを表示する為には、RegisterClassEx()関数と、CreateWindowEx()関数 を呼び出す必要があります。この際にコンソールアプリの場合、HINSTANCEを引数 に取らない為に、HINSTANCEを取得する必要があります。 HINSTANCEはGetModuleHande()関数にNULLを渡す事で取得する事ができます。 HINSTANCEを取得できれば、WinMain()関数を利用する時と同じ手順でウインドウ
スタック上に置かれるオート変数は、初期化しないとどんな値が入っているのか知れたものではありません。 コードとしては多少冗長になるかもしれませんが、オート変数を定義した時点で有意な値に初期化する癖をつけておくと、初期化忘れによるバグの数がほぼ皆無になります。 もちろんものごとには例外がありますが、特に初心者の場合、変数を定義したら初期化する、という原則を知っておくべきです。 さもなければ、いつか高い勉強代を払う羽目になるでしょう。 もちろん、C++ならすべてのメンバをきっちりコンストラクタで初期化するのは言うまでもありません。 オーバーヘッドといっても、これだけCPUやメモリが高速化している昨今、 ほんの数サイクルのCPU節約よりも、バグフリーなコードを書くほうがよほど大事です。 また、条件がそろえばコンパイラのオプティマイズで冗長なコードが消えることもあります。 不要な初期化を行わずにすむ
C#でアンマネージな関数を使いたければ、DllImportを使うのが常道です。しかし、定義の際に必ずstaticをつけることからもわかるように、静的な定義であり、プログラムの実行中に動的に関数名を決めてロード、といったことはできません。 C/C++ではWin32APIのLoadLibraryとGetProcAddressを使って得た関数ポインタで関数を呼び出すことができます。そこでC#でも同じ方法を使ってみましょう。 // デリゲートの定義 delegate IntPtr LoadImageDelegate(string filename, int flags); delegate int SaveImageDelegate(string filename, IntPtr img); [DllImport("kernel32.dll")] static extern IntPtr Load
親プロセスでは、子プロセスのメイン ウィンドウに関連付けられているプロパティを指定できます。 CreateProcess 関数は、パラメーターの 1 つとして STARTUPINFO 構造体へのポインターを受け取ります。 この構造体のメンバーを使用して、子プロセスのメイン ウィンドウの特性を指定します。 dwFlags メンバーには、構造体の他のどのメンバーが使用されているかを決定するビットフィールドが含まれています。 これにより、ウィンドウ プロパティの任意のサブセットの値を指定できます。 システムでは、指定しないプロパティに既定値が使用されます。 dwFlags メンバーは、新しいプロセスの初期化中にフィードバック カーソルを強制的に表示することもできます。 GUI プロセスの場合、STARTUPINFO 構造体は、新しいプロセスが CreateWindow 関数と ShowWindo
Win32API 指定した座標をクリックさせる方法 マウスのある座標をクリックするのは mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); だとわかるのですが、指定した座標をクリックさせる方法がわかりません。 方法を教えてください。
a. コントロール パネルを使用して DPI を設定する Windows XP と Windows Vista のどちらでも、高 DPI のディスプレイ設定を変更することができます。Windows XP と Windows Vista で高 DPI を設定する方法については、「付録 A: Windows で高 DPI を設定する」を参照してください。 DPI 設定を変更すると、システム フォントとシステム UI 要素のサイズが変わります。これが、アプリケーションのレンダリングやレイアウトに関するコードでシステム DPI 設定を考慮する必要がある主な理由です。DPI 対応でないアプリケーションでは、フォント サイズにばらつきがある、テキストが切れる、UI 要素が切れるなど、いくつかの視覚的アーティファクトが発生する可能性があります。 b. DPI 仮想化 Windows Vista には、D
VC++ のライブラリにはメモリリークの検出機能があります。関数ひとつ呼んでおくだけでアプリケーション終了時にメモリの解放漏れを出力ウィンドウに表示してくれるという便利なものなのですが、実際にこれを使うまでの過程に罠が多いのでメモしておきます。長すぎて我ながらわけがわからないので、興味のある方は最後の参考サイトだけ読んだらいいと思います。 使い方 普通に使う分には簡単です。 stdafx.h の末尾*1に : #if _DEBUG #define _CRTDBG_MAP_ALLOC #include <crtdbg.h> #define new new(_NORMAL_BLOCK, __FILE__, __LINE__) #endif と記述し、main 関数 (MFC であれば CWinApp::InitInstanceとか) 内部で ::_CrtSetDbgFlag(_CRTDBG_L
解説 1.まとめ Visual C++ 2005 (Visual Studio 2005) を使用した、「メモリリークのメモリ確保場所の特定」に関してまとめます。 より正しくは、Visual C++ 2005 (Visual Studio 2005) の出力ウィンドウに「検出したメモリリークのメモリ確保場所のソースファイル名、行番号をダンプする方法」に関してまとめます。 (「メモリリークを検出するには」も同時に実施する必要があります) 「メモリ確保関数をデバッグバージョンの関数に置き換える定義」をソースファイルの先頭に記述すると、検出したメモリリークのメモリ確保場所のソースファイル名、行番号が出力ウィンドウにダンプされるようになります。 ただし、この方法による「メモリリークのメモリ確保場所を特定」は、デバッグバージョンの場合(プリプロセッサの定義で _DEBUG が定義されている場合)にし
はじめに 今回は、Windows98やNT4.0以降で使えるようになったTrackMouseEventを使ったホバーボタンを作成します。このAPIを使うとマウスがウインドウ外に出たこととマウスが一定時間停止していることを知ることが出来ます。 今回のサンプルファイル TrackMouseEvent BOOL TrackMouseEvent( LPTRACKMOUSEEVENT lpEventTrack // TRACKMOUSEEVENT構造体のアドレス ); TRACKMOUSEEVENT構造体にデータをセットして、このAPIを呼び出します。 戻り値は、成功したときは0以外の値が返ります。また0が返ってきたときにGetLastErrorを使うと拡張エラーコードが取得できます。 _TrackMouseEvent TrackMouseEventと同じですが、こちらのAPIはTrackMouse
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く