My Daily Programming Life...

Showing posts with label Programming. Show all posts
Showing posts with label Programming. Show all posts

Windowsキーを無効にする

今作っているソフトで、一時的にWindowsキーを無効にしたいときがあった。
普通だとスタートメニューが表示されたり、ショートカットがいくつか使えたりするけど、
Windowsキーを利用するアプリを作っていて、自分のウィンドウにフォーカスがあるときだけはWindowsキーを無効にしたかった。

とりあえずその方法

まずは単純に無効にする方法。キーボードフックを利用すればよいらしい。

hHook = SetWindowsHookEx( WH_KEYBOARD_LL , WinKeyHook , hInst , 0 );

以下のURLを見れば全体が書いてある。
http://www.programmersheaven.com/mb/windows/344596/344596/how-to-disable-the-start-menu-button/

で、そこから、自分のウィンドウにフォーカスがあるときだけという条件を付けるカスタマイズ
フック関数を以下のようにする

LRESULT CALLBACK WinKeyHook(int code, WPARAM wparam, LPARAM lparam)
{
PKBDLLHOOKSTRUCT key = (PKBDLLHOOKSTRUCT)lparam;
DWORD pid=0;

switch(wparam)
{
case WM_KEYDOWN:
case WiM_KEYUP:
case WM_SYSKEYDOWN:
case WM_SYSKEYUP:
if(key->vkCode==VK_LWIN || key->vkCode==VK_RWIN){
GetWindowThreadProcessId( GetForegroundWindow() , &pid );
if( GetCurrentProcessId() == pid ){
return 1;
}
}
}
return CallNextHookEx(NULL, code, wparam, lparam);
}


これで自分がフォアグラウンドにいるときはWindowsキーが無効になる。
ただし、自分自身のウィンドウもWindowsキーのイベントを取得できなくなるので注意。
自分も必要な場合は・・・これからどうするか考えます。

マジック?

今一番知りたいことは、オブジェクト指向のよりよい設計はどのようにして考えられて、生まれるのかということ。何か基本原則というか、こういうときはこう作ればよいのようなものがあるのだろうか。デザインパターンとかそういうのはあるけど、本当にそれだけでは無理じゃないだろうか。

いまだに理解できないのはPoco(C++のライブラリ)の設計がどのようにして考えられたものなのかということ。僕にはマジックに見える。なんでこんなにうまくできてるんだ、と思えるところがいたるところにある。つまり、簡単に再利用できて、組み合わせることでどんどん新しい物が作れる。実際に目には見えるし(ソースは公開されているし)、何がどうなっているかもすべてわかる。でも"どのように"がわからない。

いつもプログラムを書くときに、どのように全体を組み立てるかを考えるけど、何をインターフェースとして、何を抽象クラスとして、そしてそれらの依存関係・・・と考えるけど、結局途中でなにかおかしくなる。

これでいいのだろうか。

Pocoのようにするには何を勉強すればいいんだろうか。単なる経験だろうか。それならそれでよいけど、なんとなくそうじゃない気がする。もっとなにかこういうことだ、ということがあってよいように思う。

Binary Treeの実装

今日はアルゴリズム、データ構造の勉強。
BinaryTreeのInsert部分だけ作ってみた

#include <cstddef>

template<class T> class BinaryTree
{
template <class T> class Element{
public:
Element()
:parent(NULL),child_less(NULL),child_more(NULL)
{
};
~Element(){ 
delete child_less;
delete child_more;
};

Element* parent;
Element* child_less;
Element* child_more;
T  obj;
};
public:
BinaryTree(void)
:m_first(NULL)
{
}

~BinaryTree(void){
delete m_first;
};

int Insert(const T& obj){
Element<T> *el = new Element<T>();
el->obj = obj;

if( !m_first ){
m_first = el;
return 1;
}

return CheckAndInsertObject( m_first , el ); 
};

private:
Element<T>* m_first;

int CheckAndInsertObject( Element<T>* target_el, Element<T>* new_el ){
if( !target_el ){
return 0;
}

if( target_el->obj < new_el->obj ){
if( target_el->child_more ){
return CheckAndInsertObject( target_el->child_more , new_el );
}
else{
target_el->child_more = new_el;
new_el->parent = target_el;
return 1;
}

}
else if( target_el->obj > new_el->obj ){
if( target_el->child_less ){
return CheckAndInsertObject( target_el->child_less , new_el );
}
else{
target_el->child_less = new_el;
new_el->parent = target_el;
return 1;
}
}

delete new_el;
return 0;

};
};

feedSubscribe to my feed