X



Win32API質問箱 Build123©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん 転載ダメ©2ch.net
垢版 |
2016/10/08(土) 12:33:02.29ID:0jaJMPXG
Win32APIについての質問はこちらへどうぞ。

■注意
・質問する前にMSDNライブラリやPlatformSDK、Google等で検索しましょう。
・日本語版MSDN Online Libraryは不完全です。
 英語版( http://msdn.microsoft.com/en-us/library/ )の利用推奨。
・APIフックなど高度な事をしたい場合はできるだけAdvenced Windowsを読みましょう。
・言語特有の問題やIDE、MFCやVCLなどの質問はそれぞれの言語や開発環境スレで

■過去スレ
Win32API質問箱 Build122
http://echo.2ch.net/test/read.cgi/tech/1451988219/
0337デフォルトの名無しさん
垢版 |
2017/01/21(土) 23:19:24.15ID:0py1wTB0
>>335
>>336

HWND hwnd;
STARTUPINFO si;
BOOL boRet = 0;
DWORD dwRet = 0;

ZeroMemory(&si, sizeof(si));
ZeroMemory(&piMplab, sizeof(piMplab));
si.cb=sizeof(si);

GetStartupInfo(&si);
boRet = CreateProcess(_T(""C:\Program Files (x86)\Microchip\PICkit 3 v3\"Pickit3.exe"),NULL,NULL,NULL,FALSE,NORMAL_PRIORITY_CLASS,NULL,NULL,&si,&piMplab);

CloseHandle(piMplab.hThread);
CloseHandle(piMplab.hProcess);

すみませんこんな感じですm(__)m↑
0339デフォルトの名無しさん
垢版 |
2017/01/21(土) 23:31:13.18ID:/qDbjX4N
アクセス権か
0343デフォルトの名無しさん
垢版 |
2017/01/22(日) 11:15:36.01ID:nyEfU5To
>>333
なんか.NETのエラーメッセージっぽいけど、.NETから呼び出しているの?
該当部分のソースを全部貼り付けなきゃ誰もわからないでしょ。
0344デフォルトの名無しさん
垢版 |
2017/01/23(月) 08:44:04.99ID:As9ZYPu9
そもそもどっちのプロセスがエラーを出してるかすら把握できてなさそう
子プロセス呼び出しはなんとなくコピペで扱うには荷が重い
0345デフォルトの名無しさん
垢版 |
2017/01/25(水) 06:02:27.98ID:s4b0iZxC
プロセスを起動して、ユーザーの入力に応答しているか確認するにはどうしたらいいでしょうか。
Process::Responding プロパティ以外の方法でお願いします。
うちの開発環境にはないので。

プロセスのウインドウを取得して、メッセージを送るくらいしか思いつかないのですが、ウィンドウがない可能性もあるし
もっとスマートな方法があればいいなと。
0347デフォルトの名無しさん
垢版 |
2017/01/25(水) 09:04:47.86ID:paQpH1yu
ネットワークプログラミングで言う所のキープアライブ的なのを実装じゃあかんの?
0348デフォルトの名無しさん
垢版 |
2017/01/25(水) 10:50:26.10ID:SLV8VPLP
>>345
WM_PAINT系のメッセージを投げて
クライアント領域が書き換わってるかどうかとか
show/hideメッセージ送って反応するかどうか見るとか
0352デフォルトの名無しさん
垢版 |
2017/02/02(木) 12:01:31.08ID:386srHJg
TrayNotifyWndにアプリアイコンを追加と削除をしたいのですが、どうすればよいでしょうか?
Shell_NotifyIconの登録みたいなやつです。
Shell_NotifyIconの登録と削除右派知っています。
0354デフォルトの名無しさん
垢版 |
2017/02/02(木) 13:37:19.22ID:386srHJg
>>353
情報ありがとうございます。やりたい内容と、ちょっと違います。
windows8.1/10とかだと、タスクバーが上か下にあるとき、タスクトレイの右側か左側にTrayNotifyWndに
[IME]、[タッチパネル向けのキーボード]、[通知]などが表示されていますよね?

それらの場所に、自作のアプリアイコンを作りたいのです。
スパイでみると、
通知 ハンドル 001016E キャプション 通知センター クラス TrayButton
キーボード ハンドル 0010172 キャプション タッチキーボード クラス TIPBand
IME ハンドル 0010156 キャプション 無し クラス Button
となっています。
親ハンドルからたどってクラスを見るとTrayNotifyWndとなっています。
知りたいのは、SHAppBarMessageを使ったタスクバーみたいなウインドウではありません。
0355デフォルトの名無しさん
垢版 |
2017/02/02(木) 13:49:49.54ID:386srHJg
googleの画像検索で googleimeとかってやると下のような画面がでますよね?
https://www.google.co.jp/search?q=googleime&;biw=1280&bih=607&source=lnms&tbm=isch&sa=X&sqi=2&ved=0ahUKEwiZzey0zfDRAhUJbrwKHQ4dBuAQ_AUICCgD#imgrc=j130VRRhjR7jdM:

TrayNotifyWndでにて、設定メニュをいじっているような画面のようなプログラムを作りたいのです。
0357デフォルトの名無しさん
垢版 |
2017/02/02(木) 14:17:43.87ID:386srHJg
>>356
一般的な、Shell_NotifyIconでタスクトレイの登録ではないです。
タスクトレイの横に登録する手続きが知りたいのです。
mozcのソースコードをgrepしたところShell_NotifyIconは使われていないようです。

comクラスとかでTrayNotifyWndに追加するような機能があるのかなぁ。。
0358デフォルトの名無しさん
垢版 |
2017/02/02(木) 14:36:09.97ID:89UtyOev
すまん。通知領域はその右側か盲目だった
直接CreateWindowでぶらさげちゃうとかできないかな
0362デフォルトの名無しさん
垢版 |
2017/02/02(木) 19:12:40.06ID:qO0hDPsp
>>357
> mozcのソースコードをgrepしたところShell_NotifyIconは使われていないようです。
ならそのソースを読めばいいんじゃね?
0364デフォルトの名無しさん
垢版 |
2017/02/02(木) 23:04:33.49ID:386srHJg
>>363
ざっくり調べたところ、おっしゃる通り言語バーのcom呼び出してるだけっぽかったです。
>>361
HWND hTaskBar = ::FindWindow(L"Shell_TrayWnd", NULL);
HWND hTrayNotify = ::FindWindowEx(hTaskBar, NULL, L"TrayNotifyWnd", NULL);
hButton = CreateWindowEx(0,L"button",L"@",WS_CHILD | WS_VISIBLE,0,0,48,24,hTrayNotify,0,hInst,0);
一瞬ボタンが表示されて消えましたw
登録のさせ方がたぶん違いますよね。
TBBUTTON tbButton = { 0 , 0 , TBSTATE_ENABLED , TBSTYLE_BUTTON , 0 , 0 , 0 };
SendMessage(hTrayNotify, TB_ADDBUTTONS, 1, (LPARAM)&tbButton);
なにも起こらず。。orz
0365デフォルトの名無しさん
垢版 |
2017/02/02(木) 23:11:43.26ID:386srHJg
HWND hTaskBar = ::FindWindow(L"Shell_TrayWnd", NULL);
HWND hTrayNotify = ::FindWindowEx(hTaskBar, NULL, L"TrayNotifyWnd", NULL);
だと、タスクトレイの内部に描画されてました。
やりたいことと違う;;
0367デフォルトの名無しさん
垢版 |
2017/02/03(金) 09:17:19.56ID:pF10NEzN
>>364
TrayNotifyWndが、もしツールバーのクラスを内部で保持してたら登録できるかなーと思いついての実験でした。。
ウインドクラスTrayNotifyWndにそんな機能はなかった。うまくいかないものですね。
0368デフォルトの名無しさん
垢版 |
2017/02/03(金) 09:34:28.94ID:pF10NEzN
HWND hTaskBar = ::FindWindow(L"Shell_TrayWnd", NULL);
HWND hTrayNotify = ::FindWindowEx(hTaskBar, NULL, L"TrayNotifyWnd", NULL);
HWND hToolbarWindow32 = FindWindowEx(hTrayNotify, NULL, L"ToolbarWindow32", NULL);
printf("handle %p %p %p ", hTaskBar, hTrayNotify, hToolbarWindow32);
SendMessage(hToolbarWindow32, TB_ADDBUTTONS, 1, (LPARAM)&tbButton);
実験してだめだったコード。。こんな感じでした。ウインドハンドルは普通に取得は成功していたみたいなんですけどね〜
0369デフォルトの名無しさん
垢版 |
2017/02/03(金) 11:42:55.01ID:mwiWK7Ca
指定したソフトが生きてるかフリーズしてるかを判断できるAPI教えてくださいよ
0372デフォルトの名無しさん
垢版 |
2017/02/03(金) 14:07:18.26ID:pF10NEzN
>>371
その画像だと、ウインドウが、タスクトレイの位置にありませんか?
タスクトレイの内部にアプリアイコンを作るのであれば、Shell_NotifyIconで登録すればいいだけです。
やりたいのは、その画像でいうと、時計の右横の通知領域の右にウインド領域を追加したいのです。
0373デフォルトの名無しさん
垢版 |
2017/02/03(金) 14:11:00.00ID:mwiWK7Ca
>>370
それだと帰ってこなかったら出した側も固まりませんか?
0374デフォルトの名無しさん
垢版 |
2017/02/03(金) 14:13:38.31ID:oHw8NUL1
>>373
別スレッドからメッセージ投げて、メインでスレッド監視して待機時間オーバーしたかどうかで判定するとか
0375デフォルトの名無しさん
垢版 |
2017/02/03(金) 14:20:41.69ID:mwiWK7Ca
>>374
なるほど。
メッセージ投げてから返答が帰るまでの待ち時間で判断するって事ですね。
ありがとうございます。さっそくやってみます。
0376デフォルトの名無しさん
垢版 |
2017/02/03(金) 14:22:20.52ID:3xPmzf3n
>>372
タスクトレイの左側にある隠れたアイコンを表示するための ^ ボタンの上に作ったボタンが表示されてる
ウインドウ表示位置だけの問題で期待してる通りだと思うよ
http://i.imgur.com/dyVnefi.png

>>373
無限ループで処理してるかもしれないから、生き死にの定義による
0378デフォルトの名無しさん
垢版 |
2017/02/03(金) 15:40:26.62ID:mwiWK7Ca
>>376
今ターゲットソフトをwhile(1)で固めて
監視ソフトでPostMessageやGetWindowRectをしたら正常に帰ってきました。
while(1)だとウィンドウの移動もできたのでこれは死亡にはならないですね

>>377
そんなのあったのですね、ありがとうございます試してみます
0379デフォルトの名無しさん
垢版 |
2017/02/03(金) 17:34:15.41ID:Q4UhsfCm
>>378
PostMessageは相手の処理を待たないから当然。
GetWindowRectも相手のプロセスが情報を返すわけじゃないから当然。
その方法を試すならSendMessage。

>while(1)だとウィンドウの移動もできたので
コンパイラの最適化によって(無意味な)無限ループが消されているかも。
0381デフォルトの名無しさん
垢版 |
2017/02/03(金) 18:07:05.86ID:mwiWK7Ca
>>379
失礼、PostMessageじゃなくてSendMessageでした。
while(1)はウィンドウは動かせますがフォーム自体は固まった状態でした(マウスカーソルがくるくるになります)

IsHungAppWindowで指定間隔で数回みて連続でTRUEなら落ちてると判断できそうな感じでした

しかしwhile(1)ではなく実際にどこかのDLL関数内で落ちてる場合とかにFindWindowでハンドルは取れるのでしょうか?
0383デフォルトの名無しさん
垢版 |
2017/02/04(土) 13:09:50.99ID:koQjiQcQ
メッセージ投げといてタイムアウトしたらあとは知らないって
まるで鍵垢へのフォロリクか2ちゃんの独り言のようだ
0387デフォルトの名無しさん
垢版 |
2017/02/05(日) 19:54:32.92ID:ajRW1B46
GetWindowRectで得た値から計算して
MoveWindowに使うとズレるんですがこれは仕様なんですか?

例えばGetWindowRectで
left=100  right=200
top=100  bottom=200
だったとして、これだと幅と高さが
101になるので
MoveWindow(hwnd,100,100,101,101,TRUE)
としたら幅と高さが1ドットずつ膨らんでしまいます
0389デフォルトの名無しさん
垢版 |
2017/02/05(日) 20:00:15.60ID:Kv3SwlRy
ピクセルの左上の隙間の位置を返す仕様(Javaと同じ)
なので単純に差を出して指定しないと膨らむ
0391デフォルトの名無しさん
垢版 |
2017/02/05(日) 20:05:12.27ID:ajRW1B46
MSDNを見ると
GetClientRectはleftとtopが常に0で
rightとbottomには幅と高さが入ってくると書かれていて
事実その通りになっていますが
GetWindowRectのほうは
ウインドウの左上座標と右下座標と表記されてるので
right-left+1 が幅になるはずです
なのでこの仕様はおかしいと思います
0392デフォルトの名無しさん
垢版 |
2017/02/05(日) 20:08:48.13ID:DkYFBwwC
>>391
英語版みたらちゃんと書いてあったよ

ていうかこの関数に限らず
Rect構造体の定義としてbottomとrightは1ピクセル外側を示すことになってる
0393デフォルトの名無しさん
垢版 |
2017/02/05(日) 20:19:29.52ID:ajRW1B46
オセロでなく碁盤で数えろってことですね
納得しました
0394デフォルトの名無しさん
垢版 |
2017/02/06(月) 11:44:22.96ID:atuXlQHb
>>392この辺ちゃんと理解してないと1ドット足りないみたいな事態になるんだよな
VBerとか1オリジンでUboundとか慣れてるとドはまりしそう
0395デフォルトの名無しさん
垢版 |
2017/02/06(月) 15:30:39.87ID:sNAkUIYE
>>391
GetClientRectの話だけど
left=top=0だとして
right=bottom=1だったら
幅と高さは1で
ウィンドウは(0,0)-(0,0)で1ピクセルのウィンドウだから
やっぱり幅と高さは1だし矛盾しない
0396デフォルトの名無しさん
垢版 |
2017/02/06(月) 16:17:17.14ID:atuXlQHb
画像の部分クリップとかやりだすとちょっと混乱したりする教訓か
ドトネトなんかではx y width heightなプロパティを別に持っている
0397デフォルトの名無しさん
垢版 |
2017/02/06(月) 17:51:48.08ID:2YUAIh/k
SetWindowPosとMoveWindowとで
ウィンドウを動かした時に何か違いはあるんでしょうか?
SetWindowPosでウィンドウは動かせるのに
MoveWindowは何のために用意されてるんですか?
0402デフォルトの名無しさん
垢版 |
2017/02/07(火) 11:40:48.78ID:+LdvU0fQ
理由も昔のことも知らないけど 今はMoveWindowの内部でSetWindowPosが呼ばれてたと思う
0405デフォルトの名無しさん
垢版 |
2017/02/17(金) 18:42:29.90ID:xKxGFEhy
実行ファイルの埋め込みマニフェストの実体をいじらずに
内容を修正した上で起動したり、任意の外部マニフェストファイルを読めるように
操作できませんか?
具体的には、マニフェストのcompatibilityの項目なんですが。。。
0406デフォルトの名無しさん
垢版 |
2017/02/17(金) 19:08:12.47ID:yGnzX63H
OSのバージョンにより異なる
ttps://msdn.microsoft.com/ja-jp/library/ms235342%28VS.80%29.aspx
ttp://www.taosoftware.co.jp/blog/2008/02/windows_1.html
ttp://nekojiru.blog.so-net.ne.jp/2007-09-03
0407デフォルトの名無しさん
垢版 |
2017/02/17(金) 19:35:32.23ID:xKxGFEhy
Windows7以降は埋め込み優先で、
実行ファイルのマニフェスト自身を書き換える方法、レジストリでOS自体の設定をいじる方法、
ActivateActCtx()でcommctl.dllは変更できるっぽい?
ってのはわかったんですが、個別に実行ファイルをいじらずに操作する方法があるかな、と思った次第です。
0408デフォルトの名無しさん
垢版 |
2017/02/17(金) 19:51:35.09ID:Z3/lG4/1
ショートカット作って、そのプロパティにアクセスして、互換性編集して、そのショートカットで起動させるとか?
0409デフォルトの名無しさん
垢版 |
2017/03/01(水) 19:41:47.62ID:GhHUeiw5
windows8.1/10 マルチモニター環境で、ウインドウの位置がタッチパネルデバイスを
有するモニターであるかを調べたい場合どうすればよいですか?

HMONITOR hMonitor = MonitorFromWindow(hWnd,MONITOR_DEFAULTTONEAREST);
これで、モニターのハンドルは調べられるのですが、
このモニターがタッチパネルを有するモニターを調べる場合どうすればいいかわかりません。
0412デフォルトの名無しさん
垢版 |
2017/03/02(木) 16:33:06.48ID:j0RdOmJS
それでタッチかどうかわかるでしょ
あとはWin32_VideoController、Win32_DesktopMonitor、GetMonitorInfoあたりと情報突き合わせたら
その座標がタッチ対応かわかる
0416デフォルトの名無しさん
垢版 |
2017/03/02(木) 21:11:15.50ID:35Ccu8m+
ユーザー側に、全てのモニターをタッチさせて、有効無効を設定してくれとダイアログだろうかと思いましたが、
プライマリーモニターかどうかを調べるのは簡単だったので、プライマリーモニターのみ対応にしたほうが混乱ないかなーと思いました。
0417デフォルトの名無しさん
垢版 |
2017/03/02(木) 21:14:09.87ID:35Ccu8m+
ユーザー側に、全てのモニターをタッチさせて、有効無効を設定してくれと、ダイアログを出そうかと思いましたが、
プライマリーモニターかどうかを調べるのは簡単だったので、プライマリーモニターのみ対応にしたほうが混乱ないかなーと思いました。
0418デフォルトの名無しさん
垢版 |
2017/03/03(金) 12:32:15.32ID:IUFykjWp
Windowsじゃ何やっても無駄ですよ。
生産性はないです。

まともにタブで操作すると考え方をタブに合わせて全体を設計し直さないとダメでです。
ポインターの概念を画像で処理する必要ががります。
マルチで接触してる部分の個々の中心点を求めて

接触している部分にボタンの候補があるかどうか
そういう処理を行わないとだめ
Windowsが使えないのは、ポインティングデバイスから無理に
座標変換してるので誤操作と誤作動だらけになる。

マイクロソフトにはこの分野は作れないと思いますよ。
0419デフォルトの名無しさん
垢版 |
2017/03/03(金) 12:56:20.62ID:Loi48FLt
入力なんていう低レベルからシェア捕れる可能性を秘めてる
集金システムもまともなのがないからそこもね
ハードからソフトまでガチガチなiphoneやandroidと違ってビジネスチャンスに溢れた自由なOS。それがWindows
0423デフォルトの名無しさん
垢版 |
2017/03/04(土) 14:25:59.12ID:GRvQ2lmz
シェア獲得率と優劣は比例しない
0426デフォルトの名無しさん
垢版 |
2017/03/04(土) 15:10:40.29ID:aE/wnzST
別に使われてると思ってるなら良いんでない?
俺は趣味でもあり金を稼ぐ道具でもあるからMacなんて使わんけど。

だいたい、知らんもんで金は稼げない。
0427デフォルトの名無しさん
垢版 |
2017/03/04(土) 18:17:19.42ID:ZJLt6oM8
MacをPCだとするとシェア4%になるが
DTMコンソールやCG用レンダラーだとするとシェアが何倍にもなる不思議
0430デフォルトの名無しさん
垢版 |
2017/03/05(日) 14:27:40.01ID:zkc5hO4d
ベンダー出荷シェアとかOSの販売数ってのは利用率なシェアとは別モンだからな
0431デフォルトの名無しさん
垢版 |
2017/03/05(日) 17:20:05.73ID:KDLljhIv
光学ドライブのAutoRunを無効にしてると、ディスクを入れ替えたことに気付けないみたいですが、
どうやったらディスクの情報をリフレッシュさせることができるのでしょうか?
ディレクトリ一覧を取得しようとしても、入れ替え前のディスクのディレクトリが出てきて困ってます
0432デフォルトの名無しさん
垢版 |
2017/03/05(日) 19:16:54.98ID:zkc5hO4d
今のOSはAutoRun最初から無効だから、それが本当ならほとんどのPCでまともに取得できないってことになるな
ソースどっかミスってるんでしょ
0433デフォルトの名無しさん
垢版 |
2017/03/05(日) 19:23:58.07ID:91bxBwXE
もちろんエクスプローラーで開けば情報は更新されます。プログラムからトレイを開閉しても情報は更新されます。
光学ドライブのボタンで開閉すると、情報が更新されないままなのです。
0435デフォルトの名無しさん
垢版 |
2017/03/10(金) 01:12:03.58ID:5qliBH2Z
https://ideone.com/i4fQGS
Win32API勉強中なんですが、ウィンドウを作ることができません、hWndがNULLになってしまって途中で終わってしまいます
ウィンドウクラスの登録も失敗していないみたいなので原因がわかりません、どこが悪いのか教えてください
0436デフォルトの名無しさん
垢版 |
2017/03/10(金) 03:42:45.84ID:Vp9TD86Z
自分のウインドのZオーダーが変化したタイミングを調べたいのですが、
ウインドメッセージでなにかありましたっけ?
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況