dポイントプレゼントキャンペーン実施中!

WIN32APIについて質問です。

C++を用いてデスクトップにフォーカスを与えるプログラムを
作成する為に、デスクトップのウィンドウハンドルを得る
GetDesktopWindow関数を使用しています。

しかし結果はフォーカスが設定できず、エラーとなります(下記ソースをご参照下さい)。
ググってみるとこの関数は実際にはデスクトップのウィンドウハンドルを返している
訳ではなく、他のハンドルを返しているようです。

他の方法も試してみましたが、一向にデスクトップを操作することができません。
何か良い方法をご存知ないでしょうか?
よろしくお願いします。


~テストに使用したソース~

#include <windows.h>

int WINAPI WinMain( HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR pCmdLine, int showCmd )
{
if( SetFocus( GetDesktopWindow() ) == NULL )
MessageBox( NULL, "フォーカスが設定できない", "エラー", MB_ICONSTOP );

return 0;
}

A 回答 (5件)

MSDNでSetFocusについて調べてみましたが、自プロセス以外のウィンドウに対しては失敗するようですね…。

    • good
    • 0
この回答へのお礼

ご回答、ありがとうございます。

1度MSDNで調べたことはありますが、確かにスレッドをアタッチ云々の記述がありますね。
しかし…アタッチするためにはシステム以外のスレッド、と制限が設けられていますね。
もしかしたら失敗する可能性も…。

スレッドのアタッチは使った事がないので、時間に余裕があるときにでもゆっくりと
調べていこうと思います。

ありがとうございました。

お礼日時:2010/10/06 19:07

失礼しました。

(汗)
リンク貼りなおします。

http://oshiete.goo.ne.jp/qa/5664072.html
    • good
    • 0
この回答へのお礼

ご回答、ありがとうございます。

今度はページを確認できました。

ハンドルの子供の子供とややこしく、ぱっと見では何をしているのか
まったく分かりませんが、質問内容よりシステムかexplorerあたりの
ウィンドウハンドルを取得している風ですね。

デスクトップのメニューなんたらを弄っているようですので、
迂闊に試す気はありませんが、リファレンスでAPI関数を
辿っていこうと思います。

興味深い情報、感謝です。

お礼日時:2010/10/06 19:17

具体的に何にフォーカスを与えたいのでしょうか?


今のWindows(Windows95以降)は、Windows本来のデスクトップウィンドウの上に、見かけの(アイコンなどが並んでいる)デスクトップが被さった形になっていたと思います。

なので、アイコンなどを操作したいのであれば、「見かけ」のほうを操作しなければならなかったと思います。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

デスクトップとexplorerの関係が未だに不透明ではあるのですが、
フォーカスを与え、デスクトップ上のアイコンのどれかが
選択されている状態、または矢印キーによってアイコンが選択できる
ようになっている状態に持っていく事が目的です。

要はWinVistaや7でのAlt+Tabキーでデスクトップを選択した状態ですね。


よろしくお願いします。

お礼日時:2010/10/06 19:12

「デスクトップを操作」とは具体的にどのような内容でしょうか?


アイコンの操作であれば
↓のQ&Aが参考になるかもしれません。
http://m.oshiete1.goo.ne.jp/answer/detail/q56640 …
    • good
    • 0
この回答へのお礼

ご回答、ありがとうございます。

残念ながらPCでの閲覧は不可なようでした。
また、1番の目的はデスクトップのウィンドウハンドルの取得です。
ついでにできたら~、程度の優先度ですので、前者の方をお願いいたします。

参考になりそうなサイトがありましたら、またご回答頂けると幸いです。

お礼日時:2010/10/06 09:18

デスクトップが”ウィンドウ”ではないので、フォーカスを設定する事が出来ないのではないでしょうか?



今、環境が無いので、調べる事が出来ないのですが、

Spy などを使って、Windowsメッセージを見ながら、デスクトップにフォーカスを移すときに、流れているメッセージをフックして見て、その通りにプログラムを流し込んでいけば出来るように思えます。

状況から見て、デスクトップを操作って事を言われているので、フォーカスを当てるのが目的ではなくて、違うメッセージ処理をおkなうのの奈良、それを書いた方がより実践的な事が書かれると思います。

単純に、デスクトップにフォーカスを移すってだけなら、
GetActiveWindw でアクティブウィンドウを取得して、Active Window に KILLFOCUS でフォーカスを手放させて...再度、GetActiveWindow で取得してを繰り返していけば、いずれデスクトップがフォーカスを取得する事になると思います(試していないので、不安はありますけどね)
    • good
    • 0
この回答へのお礼

ご回答、ありがとうございます。

今現在はデスクットップのフォーカスを取得することが目的です。
できるなら、SetWindowLong関数あたりでスタイルの変形や
フックを掛けてみたいとは思っていますが、それは後回しにしています。

また、私が調べた範囲では、デスクトップはリストビューの一種なのだと
結論付けていますが、実際のところは不明です。
実際、デスクトップの画面キャプチャは通常のウィンドウと同じ操作で可能
なようですし(試したことはありませんが)

Spyツールでの操作も考えたことはありますが、その場限りの操作になっています
ので利用価値は低いです。

他のアクティブウィンドウの優先度を下げる方法は考えていなかったので、
デスクトップのウィンドウハンドルが取得不可能なら、採用させて頂こうと
思います。

お礼日時:2010/10/05 21:00

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!