Win32API質問箱 Build66
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2008/05/14(水) 23:33:42やさしいお兄さんやお姉さんたちが答えてくれるかも。
過去スレ、関連リンクは>>2-10くらい。
■注意
・質問する前にMSDNライブラリやPlatformSDK、Google等で検索しましょう。
・日本語版MSDN Online Libraryは不完全です。英語版(http://msdn2.microsoft.com/library/)の利用推奨。
・APIフックなど高度な事をしたい場合はできるだけAdvenced Windowsを読みましょう。
・言語特有の問題やIDE、MFCやVCLなどの質問はそれぞれの言語や開発環境スレで
- Win32API質問箱 wiki
http://wiki.livedoor.jp/program1/d/FrontPage
Win32API質問箱 Build65
http://pc11.2ch.net/test/read.cgi/tech/1208847084/
0153デフォルトの名無しさん
2008/05/20(火) 01:22:59試したところ上手くいきました。ありがとうございます。
検証コード
#include <windows.h>
#include <msxml2.h>
#include <stdio.h>
#pragma comment(lib, "ole32")
#pragma comment(lib, "msxml2")
void examine() {
static int counter = 0;
IXMLDOMDocument* pv = NULL;
HRESULT hr = CoCreateInstance(CLSID_DOMDocument2, NULL, CLSCTX_INPROC_SERVER, IID_IXMLDOMDocument, (void**)&pv);
printf("%d : hr=%08lx\r\n", ++counter, hr);
if (SUCCEEDED(hr) && pv) { pv->Release(); }
}
void main () {
examine(); CoInitialize(NULL);
examine(); CoInitialize(NULL);
examine(); CoInitialize(NULL);
examine(); CoUninitialize();
examine(); CoUninitialize();
examine(); CoUninitialize();
examine();
}
0154デフォルトの名無しさん
2008/05/20(火) 04:48:05DllMainでCoInitializeを呼ばないように注意して書いた方がいいぞ
0155デフォルトの名無しさん
2008/05/20(火) 20:02:02それはすでにやっていて、フォーカスが外れても灰色にはなるのですが
その灰色になる時に青いままにしたいのですが無理でしょうか?
0156デフォルトの名無しさん
2008/05/20(火) 20:08:520157デフォルトの名無しさん
2008/05/20(火) 20:17:540158デフォルトの名無しさん
2008/05/20(火) 21:32:45そうなんですかね、
あきらめてフックしなきゃダメか。
0159デフォルトの名無しさん
2008/05/20(火) 22:40:29それはアパートメントはどーなるんだ?
MTAとか混じってたら死亡でないのか?
0160デフォルトの名無しさん
2008/05/20(火) 22:48:05>>51
やってみたんですがダメでした。成功したらまた来ます。
0161デフォルトの名無しさん
2008/05/20(火) 23:02:34エラーになってRPC_E_CHANGED_MODEが返ってくる。
http://msdn.microsoft.com/en-us/library/ms695279(VS.85).aspx
0162デフォルトの名無しさん
2008/05/21(水) 09:34:44〔背景BMP+新BMP〕HDC hdcBmp = 背景BMP
HDC hdcBmp3 = CreateCompatibleDC(hdcBmp);
HBITMAP hBMP3 = CreateCompatibleBitmap(hdcBmp,300,300);
SelectObject(hdcBmp3,hBMP3);
BitBlt(hdcBmp3背景BMPの上に新BMPを描画);
case WM_PAINT:
BitBlt(GetDC(hWnd),hdcBmp3を描画);
背景BMPに新BMPをくっつけたものを描画したいのですが
背景BMPが黒で塗り潰されてしまいます。
┏━━━━━━━━━┓
┃背景BMP ┃
┃┏━━━━━━━┓┃
┃┃新BMP ┃
0163デフォルトの名無しさん
2008/05/21(水) 09:46:000164デフォルトの名無しさん
2008/05/21(水) 09:48:550165デフォルトの名無しさん
2008/05/21(水) 09:53:39その疑似コードだけ見ると、hdcBmp3に背景BMPを描画していないように
思えるが。
0166デフォルトの名無しさん
2008/05/21(水) 09:58:47BltBlt(hdcBMP3,背景BMP);
BltBlt(hdcBMP3,新BMP);
これで大丈夫でしょうか?
0167デフォルトの名無しさん
2008/05/21(水) 10:50:26CreateCompatibleBitmapにメモリDCを指定しては駄目。
あと
>case WM_PAINT:
>BitBlt(GetDC(hWnd),hdcBmp3を描画);
これは駄目だろ
0168デフォルトの名無しさん
2008/05/21(水) 10:57:03CreateCompatibleBitmapには何を指定すればよいのでしょうか?
0169デフォルトの名無しさん
2008/05/21(水) 12:25:510170デフォルトの名無しさん
2008/05/21(水) 12:30:010171デフォルトの名無しさん
2008/05/21(水) 12:39:18突込みどころ満載のソースだな
まぁ頑張れw
0172デフォルトの名無しさん
2008/05/21(水) 12:43:18背景と前景を自前で合成して描画すればおk
0173デフォルトの名無しさん
2008/05/21(水) 12:50:050174デフォルトの名無しさん
2008/05/21(水) 13:05:19MFCとかプログラミングじゃねーよ。あれ
0175デフォルトの名無しさん
2008/05/21(水) 13:44:17突っ込んで下さい。
0176デフォルトの名無しさん
2008/05/21(水) 14:33:550177デフォルトの名無しさん
2008/05/21(水) 15:00:09MFCなんて一皮剥けばバリバリWin32APIじゃないか
0178デフォルトの名無しさん
2008/05/21(水) 17:22:34プログラミングスタイルが受け付けない
TODO:ここにプログラム書いてね。みたいなのばかり。
しかも、いちいち用意されてる関数調べて、くっつけるだけ。
それで動かしてみて、動いてよかった。で終わり。
こんな状況でバグが出たら、生き地獄だ。
0179デフォルトの名無しさん
2008/05/21(水) 17:27:430180デフォルトの名無しさん
2008/05/21(水) 17:33:160181デフォルトの名無しさん
2008/05/21(水) 17:39:51Win32APIの勉強始めた頃は俺もそう思ってた。
今じゃGUIライブラリ無しで作る気起きませんサーセン
0182デフォルトの名無しさん
2008/05/21(水) 18:01:25HDC hdc, hdcBmp[1], hBack[1];
HBITMAP hBmp[1];
BITMAP bm;
hdc = GetDC(hWnd);
hdcBmp[0] = CreateCompatibleDC(hdc); //背景BMP
hdcBmp[1] = CreateCompatibleDC(hdc); //新BMP
hBack[0] = CreateCompatibleDC(hdc); //合成BMP
hBmp[0] = (HBITMAP)LoadImage(hInst,MAKEINTRESOURCE(IDB_BITMAP1),IMAGE_BITMAP,0,0,LR_DEFAULTCOLOR);
hBmp[1] = (HBITMAP)LoadImage(hInst,MAKEINTRESOURCE(IDB_BITMAP2),IMAGE_BITMAP,0,0,LR_DEFAULTCOLOR);
SelectObject(hdcBmp[0],hBmp[0]);
SelectObject(hdcBmp[1],hBmp[1]);
// バックBMP
hBack[0] = hdcBmp[0];
BitBlt(hBack[0],0,20,bm.bmWidth,40,hdcBmp[1],0,20,SRCCOPY);
ReleaseDC(hWnd,hdc);
case WM_=PAINT:
BitBlt(hdc,0,100,bm.bmWidth,bm.bmHeight,hBack[0],0,0,SRCCOPY);
hdcBmp[0]とhdcBmp[1]に背景と新BMPを読み込み、背景と新BMPを合成したものをhBack[0]に読み込む。
そしてWM_PAINT時に合成した画像を描画する。という事ですか?
0183デフォルトの名無しさん
2008/05/21(水) 18:15:460184デフォルトの名無しさん
2008/05/21(水) 19:16:48アダルトアニメやゲームを規制すべき」というものです。もしもこれらが規制されてしまうことに
なれば、全国のモテない童貞男子諸君にとって大打撃です。
この嘆願が提出された理由ですが、ちょっとひどい。
街中に氾濫(はんらん)している美少女アダルトアニメ雑誌やゲームは、小学生の少女を
イメージしているものが多く、このようなゲームに誘われた青少年の多くは知らず知らず
のうちに心を破壊され、人間性を失っており、既に幼い少女が連れ去られ殺害される事件
が起きている。これらにより、幼い少女たちを危険に晒(さら)す社会をつくり出していること
は明らかで、表現の自由以前の問題である。社会倫理を持ち合わせていない企業利潤追
求のみのために、幼い少女を危険に晒している商品を規制するため、罰則を伴った法律
の制定を急ぐ必要がある。
ついては、美少女アダルトアニメ雑誌及び、美少女アダルトアニメシミュレーションゲーム
製造及び販売規制の罰則を伴った法律を制定されたい。
物凄く分かり易く要約すると、「エロゲーをする奴は心が壊れていて人間じゃないから幼女を
強姦する。だからエロゲーを規制しろ」ということになります。ええと、円議員あなたの血は何色
ですか?
だいいち嘆願理由にしても私から言わせて貰えば、「ゲームをしているうちに心が破壊される」
のではなく、「現実世界で心が破壊されたからゲームに逃げた」のです。よくよく考えれば普通の
人は分かるはずです。あれはタダの絵だ、と。
この「美少女アダルトアニメ雑誌及び美少女アダルトアニメシミュレーションゲームの製造・販
売を規制する法律の制定に関する請願」に賛同している議員は、円より子参議院議員のほかに
は、同じく民主党の下田敦子参議院議員がいます(5月21日現在)。増えないことを祈るばかりです。
http://digimaga.net/200805/adult-game-user-is-not-human.html
0185デフォルトの名無しさん
2008/05/21(水) 20:09:47まずは分かりやすい変数名を付ける事から学べ
0186デフォルトの名無しさん
2008/05/21(水) 20:19:12すみませんでした。
背景用変数 = 背景BMP;
貼付けるBMP用変数 = 新BMP;
上部二つの合成用変数 = 合成したBMP(背景BMP+新BMP);
BitBlt(上部二つの合成用変数);
0187デフォルトの名無しさん
2008/05/21(水) 20:46:35まずは分かりやすい変数名を付ける事から学べ
0189デフォルトの名無しさん
2008/05/21(水) 20:55:16お前はプログラマに向いていない
転職をおすすめする
0190デフォルトの名無しさん
2008/05/21(水) 21:03:26そのゴミソース引き継いだ奴はめちゃくちゃ苦労するんだよボケがw
0191デフォルトの名無しさん
2008/05/21(水) 21:05:56WM_PAINTがきたときに背景BMPと重ねるBMPを
自前で合成して一度のBiBlt呼び出しで描画するという意味。
それぞれのBMPはメモリ上にあるんでしょ?
とりあえずこれで動くものを作ってから原因とか考えながらゆっくりAPIの使いかた覚えればいいと思うよ。
0192デフォルトの名無しさん
2008/05/21(水) 21:36:47テキストエディタまがいのものでもつくってみようと始めたはいいのですが、
GETOPENFILENAME 関数を使ってファイルを開くダイアログを作ろうとしたところ、
"OPENFILENAME構造体が定義されていない"
とエラーが出ます。
てっきり windows.h で定義されていると思っていたのですが、
これでないならなんのヘッダをインクルードすればいいのでしょうか?
0193デフォルトの名無しさん
2008/05/21(水) 21:48:53Declared in Commdlg.h, include Windows.h
てっか、WindowsSDK入れてる?
0194デフォルトの名無しさん
2008/05/21(水) 22:00:45WIN32_LEAN_AND_MEAN
0195デフォルトの名無しさん
2008/05/21(水) 22:02:04WM_CREATE等最初に合成したものを
WM_PAINT時に使うということですか?
0196デフォルトの名無しさん
2008/05/21(水) 22:14:25ソースが突込み所満載なんだがまさか釣りじゃないよな?
本気で書いたソースならC言語についてもやばいぞ
0197デフォルトの名無しさん
2008/05/21(水) 22:20:08早く突っ込んでくれ
0199デフォルトの名無しさん
2008/05/21(水) 22:27:37なんでやねん
0200デフォルトの名無しさん
2008/05/21(水) 22:39:34じゃあケツ出せよ
0201デフォルトの名無しさん
2008/05/21(水) 22:41:15WM_ACTIVATEでフォーカスを失った時にブレークにはかかったのですが、
カスタムドローするのに必要なパラメータがなかったのでできませんでした。
オーナードローで頑張ればできるのでしょうか?
0202デフォルトの名無しさん
2008/05/21(水) 22:52:33BITMAPの合成はどうやればよいのですか?
0203デフォルトの名無しさん
2008/05/21(水) 23:33:54別にWM_CREATE時じゃなくていいよ。
ちらつきを抑えたいからダブルバッファしたいんだろうからBMPは常にメモリ上にあるという仮定で、
WM_CREATEがきたときに別途mallocでもnewでもいいからバッファを確保して
そのバッファに背景BMPと表示したいBMPを合成したものを作成。
それをBitBltやStretchDIBitsのような描画関数で表示。
0204デフォルトの名無しさん
2008/05/22(木) 00:00:22HANDLE_MSG() マクロを WM_COMMAND に対して使うとき、なんで return 0; になるんだ?
HANDLE_MSG() に渡すfn は void func(HWND...) でvoid型だし、HANDLE_MSG() 自体も
#define HANDLE_MSG(hwnd, message, fn) ¥
case message):return ((fn)(hwnd,...),0L)
でマクロ展開で「return 0;」が出てくる理由がよく解らん。
case message: return func(hwnd,...); //func() はvoid型
になるんじゃないの?
0205デフォルトの名無しさん
2008/05/22(木) 00:10:42return a, b;
returnされるのはbの値。
0206デフォルトの名無しさん
2008/05/22(木) 06:15:18WM_DRAWITEMとか、
> If an application processes this message, it should return TRUE.
って書かれてるのにvoidでreturn 0;されてるし
0207デフォルトの名無しさん
2008/05/22(木) 06:17:56カンマ演算子、か。K&Rの演算子の表の一番下に確かにそんなのあるな。いままで意識した事無かった
ありがと
0208デフォルトの名無しさん
2008/05/22(木) 08:01:40間違っています。
以上。
↓次の方どうぞ
0209デフォルトの名無しさん
2008/05/22(木) 08:58:290210デフォルトの名無しさん
2008/05/22(木) 09:05:150211デフォルトの名無しさん
2008/05/22(木) 10:19:57外部アプリからメモリ内サーチして書き換えるやつ防止したい。助言よろ。
0212デフォルトの名無しさん
2008/05/22(木) 10:34:360213デフォルトの名無しさん
2008/05/22(木) 11:03:18オンラインゲームじゃないなら、改造対策は不要では?
俺もゲーム作ってるんだが、ブログで改造対策のこと書いたら、
「改造対策する時間があるなら、ゲームのボリュームを増やすこととか、
もっとまともなことに使って欲しい」ってコメントが多かったよ。
改造するかはユーザーの自由なんだし、ユーザーとしては当然のコメントだが。
あと、いまどきの改造は、プロセスメモリエディタ+ルートキットで
やるから、改造を防止するなら、ユーザーから非難されることを覚悟のうえで
ルートキットじみたことをするしかないでしょうね。
0214デフォルトの名無しさん
2008/05/22(木) 12:37:49そのような外観の(ダイアログでない)ウィンドウを、
ウィンドウクラスで作ったウィンドウに、コントロールぺたぺた貼って作ろうと思ったら、
(CWndではなく、RegisterClassEx、CreateWindow使って)
・ウィンドウの背景色は何故かCOLOR_BTNSHADOWが(ダイアログと)等しい
・エディットボックスはCreateWindowExの第1引数にWS_EX_CLIENTEDGEにしないと立体の縁にならない
・フォントはWM_SETFONT使ってサイズを変更しないと文字がでかい
・そもそもデフォルトのフォントが当然MS shell dlgではないようで、よくわからない
(ただ、画面のプロパティから、故意にダイアログとウィンドウのフォントを違うものにした覚えはない…)
実際CreateDialogマクロでダイアログが作られるとき、ここら辺の設定ってどうなっているのですか?
このマクロもCreateWindowExを使ってウィンドウを作ると書いてあるので、
同じようなことが再現できるのではと思ったのですが…
(CreateDialogがウィンドウの大きさを決めるとき、フォントを元に作ってあるのはわかったのですが…)
0215デフォルトの名無しさん
2008/05/22(木) 13:05:33どうもGetWindowTextで取得できるものとは別物らしく、
Process ExplorerでJuneブラウザのWindow Titleを見ると、
GetWindow〜で取得した名前とは違うものを表示しているのがわかります。
一体Process Explorerで表示できるWindow Titleとは何者か、
どうすれば取得できるのでしょうか?
0216デフォルトの名無しさん
2008/05/22(木) 13:19:39ttp://msdn.microsoft.com/en-us/library/ms633520.aspx
> GetWindowText cannot retrieve the text of a control in another application.
0217デフォルトの名無しさん
2008/05/22(木) 13:34:18そうするとWindow Titleってなんだろうという話になりまして、
たとえばJaneブラウザを表示したとき、以下のようになります。
・キャプションバー、およびProcessExplorer上WindowTile列の表示
→”Jane Doe Style 【プログラム】 - Win32API質問箱 Build66”
・GetWindowText、およびタスクマネージャ上の表示
→”Jane”
”Jane Doe Style 【プログラム】 - Win32API質問箱 Build66”の文字列を取得したいわけですが、
その方法はご存知でしょうか?
0218デフォルトの名無しさん
2008/05/22(木) 13:44:310219デフォルトの名無しさん
2008/05/22(木) 14:00:33VBアプリもそんな感じだったな
だからタスクバーに表示しないプロパティなんてのがあるんだけど
0220デフォルトの名無しさん
2008/05/22(木) 14:07:520221デフォルトの名無しさん
2008/05/22(木) 14:14:12メインウィンドウに見えたのは子ウィンドウで、だから取得できなかったと。
子ウィンドウのウィンドウタイトルの取得とか、そのあたりを調べてみます。
ありがとうございます
0222デフォルトの名無しさん
2008/05/22(木) 14:14:17こんなんでいいのかな?
#include<windows.h>
#include<stdio.h>
int main(void){
char title_buf[256], *class_name="TMainWnd";
int title_len;
HWND hwnd;
hwnd=FindWindow(class_name, NULL);
if(hwnd==NULL){
printf("Window not found. class name [%s]\n", class_name);
return 1;
}
title_len=GetWindowText(hwnd, title_buf, sizeof(title_buf)-1);
if(title_len>=0) printf("%s\n", title_buf);
return 0;
}
0223デフォルトの名無しさん
2008/05/22(木) 14:59:33どうもです
実行結果とSpy++を併せて見て、おおよそ理解できました。
デルファイでもVBでもデフォルトのクラス名でウィンドウを検索したのち、
目的の名前を取得する事ができました
ありがとうございます
0224デフォルトの名無しさん
2008/05/22(木) 15:05:000225デフォルトの名無しさん
2008/05/22(木) 16:22:09今時こんなソース書く奴はJavaか.NETで開発してろよと思う
0226デフォルトの名無しさん
2008/05/22(木) 16:25:53この場合同書くのがいいのかも示して欲しいです
0227デフォルトの名無しさん
2008/05/22(木) 16:28:58>>226に同意
どう書けばよいのでしょう?
TCHARの話でしょうか?
0228デフォルトの名無しさん
2008/05/22(木) 16:29:51あたりじゃない?
0229デフォルトの名無しさん
2008/05/22(木) 16:54:54(使用しているのは MinGW)
0230デフォルトの名無しさん
2008/05/22(木) 16:59:28ARRAY_SIZE と countof はあったの?
0231デフォルトの名無しさん
2008/05/22(木) 17:01:22無いです
0232デフォルトの名無しさん
2008/05/22(木) 17:12:16SDKにはwinnt.hにRTL_NUMBER_OFがある
いずれにしろ>>222は人に教えられる立場で無いのは確か
0233デフォルトの名無しさん
2008/05/22(木) 17:20:270234デフォルトの名無しさん
2008/05/22(木) 17:24:19>222もエラーチェックにしか使ってないようだし、>228によればナルターミネートはしてくれているようだし。
つーか、溢れたかどうかは単純には判らないのね。
0235デフォルトの名無しさん
2008/05/22(木) 17:27:19if(title_len>=0) printf("%s\n", title_buf);
を
if(title_len>0) printf("%s\n", title_buf);
にしないとエラーチェックになってない
0236デフォルトの名無しさん
2008/05/22(木) 18:18:19GetWindowTextLengthで事前にバッファ長を調べておけば済むだろ
0237デフォルトの名無しさん
2008/05/22(木) 18:27:58この逆のことをするAPI、つまりグリフインデックスから文字列に変換する方法って解りますか?
0238デフォルトの名無しさん
2008/05/22(木) 18:28:29そうだとしても戻り値にNULL文字は数えないって書いてあるから
指定サイズ==戻り値ならあふれてるのでは。
0239デフォルトの名無しさん
2008/05/22(木) 18:31:24馬鹿丸出し
0240デフォルトの名無しさん
2008/05/22(木) 18:37:47しかし長さを調べた直後には別のウィンドウタイトルに変わっているかもしれない
そのアプリケーションがどう振舞うか想定できない
0241デフォルトの名無しさん
2008/05/22(木) 18:50:52(そろそろフックネタ出す奴が現れる頃か)
0242デフォルトの名無しさん
2008/05/22(木) 18:50:58その間にタイトルが書き換わっていたら溢れたかどうかは判らないのね。
0243デフォルトの名無しさん
2008/05/22(木) 19:10:58必要十分なサイズのバッファを渡せば溢れる可能性は無くなる。
LPTSTR buffer = (LPTSTR)malloc(sizeof(TCHAR) * 0x7fffffff);
if (buffer == NULL) {
MessageBox(NULL, _T("この環境では使用できません"), _T("メモリ買いましょう"), 0);
exit(-1);
}
GetWindowText(hwnd, buffer, 0x7fffffff);
0244デフォルトの名無しさん
2008/05/22(木) 20:36:32VirtualAllocのMEM_RESERVEでアドレスだけ確保して、
SEHで動的にメモリを割り当てるのが現実解だな。
0245デフォルトの名無しさん
2008/05/22(木) 20:59:090246デフォルトの名無しさん
2008/05/22(木) 21:19:35ヒント:お前は馬鹿
0247デフォルトの名無しさん
2008/05/22(木) 21:23:100248デフォルトの名無しさん
2008/05/22(木) 21:34:080249デフォルトの名無しさん
2008/05/22(木) 21:51:370250デフォルトの名無しさん
2008/05/22(木) 21:58:090251デフォルトの名無しさん
2008/05/22(木) 22:06:480252デフォルトの名無しさん
2008/05/22(木) 22:25:19■ このスレッドは過去ログ倉庫に格納されています