スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

--.--.-- | スポンサー広告

IAppPublisher……じゃなかったり

本当は IAppPublisher インターフェイスを題材にしようかと思ったのですが、
MSDN Blog にまんまのサンプルがあったのでやめました。
ちなみにアレをそのまま実行しても何も表示されないと思います。
このインターフェイス、どうもアプリケーションの製作者の情報を
取得するものらしいので( ´・ω・)

しょうがないのでまた古いソースからネタをひっぱてきてみた。


#include <windows.h>

BOOL CALLBACK MinimizeProc(HWND hWnd, LPARAM lParam)
{
HWND hwnd_parent = ::GetWindow(hWnd, GW_OWNER);
WCHAR window_title[255];

long window_style = ::GetWindowLong(hWnd, GWL_STYLE);
if((hwnd_parent == NULL) && (window_style & WS_VISIBLE)
&& !(window_style & WS_DISABLED))
{
::GetWindowText(hWnd, window_title, sizeof(window_title));

// 例外的除外
if(!wcscmp(window_title, L"Program Manager"))
return TRUE;

::ShowWindow(hWnd, SW_MINIMIZE);
}

return TRUE;
}

int _tmain(int argc, _TCHAR* argv[])
{
ANIMATIONINFO anime_info;
bool animationa_was_on = false;

anime_info.cbSize = sizeof(anime_info);
::SystemParametersInfo(SPI_GETANIMATION,
sizeof(anime_info), &anime_info, 0);

if(anime_info.iMinAnimate != 0)
animationa_was_on = true;

if(animationa_was_on)
{
anime_info.iMinAnimate = false;
::SystemParametersInfo(SPI_SETANIMATION,
sizeof(anime_info), &anime_info, 0);
}

::LockWindowUpdate(::GetDesktopWindow());
::EnumWindows((WNDENUMPROC)MinimizeProc, 0);
::LockWindowUpdate(NULL);

if(animationa_was_on)
{
anime_info.iMinAnimate = true;
::SystemParametersInfo(SPI_SETANIMATION,
sizeof(anime_info), &anime_info, 0);
}

return 0;
}


最小化アニメーションを切った状態ですべてのウインドウを
最小化するサンプルプログラムです。
……意味不明な日本語になっているような気もしますが
実際に動かしてみるとわかるかと思います。


スポンサーサイト

テーマ:プログラミング - ジャンル:コンピュータ

2006.07.28 | Comments(0) | Trackback(0) | プログラム

IShellWindows……

以前 WriteFileEx に関して
「ファイル作成が終了するまで何度かコールバックに処理が入ってくると思ったので
すが」
というお馬鹿なことを書いていましたが
MSDN を見ると
"Pointer to a completion routine to be called when the write operation has
been completed and the calling thread is in an alertable wait state."
とはっきり明記されてました。
(自分アホス……)

以前も MSDN をちゃんと見た気がするんだけどなあ……寝ぼけてたのかな……

後 Remarks のところに
"GetLastError によるチェックもちゃんとしやがれ"と書いてました。



前回 IShellIconOverlay をお届けるする予定と書いたのですが
とてもインターフェイスをいじって遊んでいる時間がないので
私の手元にある古いソースコードからお届け(´・ω・`)

デスクトップ上にあるエクスプローラのアドレスを表示するプログラム
……なのですが VS2005 でコンパイルできるもののメモリーアクセス違反落ちてしまいます(´・ω・`)

VC++6.0 ではまったく問題ないし、MS の KB に載っている方法なので
ソースコードに問題があるとも思えないのですが……
内部的な仕様でも変更されたのかな? と思い直接 Item を IWebBrowser2Ptr に渡したところうまくいきました……う~む

#include "stdafx.h"
#import <mshtml.tlb>
#import <shdocvw.dll>
#include <exdisp.h>

int _tmain(int argc, _TCHAR* argv[])
{
SHDocVw::IShellWindowsPtr sh_windows;
HRESULT hr;

hr = ::CoInitialize(NULL);
if(FAILED(hr)) return 0;

hr = sh_windows.CreateInstance(__uuidof(SHDocVw::ShellWindows));
if(FAILED(hr)) return 0;

long nCount = sh_windows->GetCount();
HWND hForegroundWnd = ::GetForegroundWindow();

for (long i = 0; i < nCount; i++)
{
_variant_t index(i, VT_I4);

SHDocVw::IWebBrowser2Ptr web_browser2(sh_windows->Item(index));

HWND hWnd;
web_browser2->get_HWND((long*)(&hWnd));

BSTR url;
web_browser2->get_LocationURL(&url);
::MessageBox(NULL, url, L"URL", MB_OK);
web_browser2.Release();
}

sh_windows.Release();
::CoUninitialize();

return 0;
}

ソースコード的に問題が無いか、微妙だのお(´・ω・`)

テーマ:プログラミング - ジャンル:コンピュータ

2006.07.05 | Comments(0) | Trackback(0) | プログラム

«  | HOME |  »

ブロとも申請フォーム

この人とブロともになる

カウンター


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。